一、说在前面

昨天 完成了对记账本的账单的增删
今天

完善昨天的框架结构(

1、引入ViewModel管理数据、使MainActive 只管理界面、不再管数据了

2、引入AsyncTask、后台执行。不必强制在主线程执行

3、将Database.java修改为singleton模式、只维护一个Database

4、引入LiveData

问题 没有

二、结构完善

1、引入LiveData,管理所有账单,设置观察者,自主更新界面数据,不必再调用unDataView()来更新界面。

1)、Dao

@Query("SELECT * From ACCOUNTRECORD ORDER BY ID DESC")
LiveData<List<AccountRecord>> getAllAccountRecordLive ();

2)、在MainActive中设置观察者

 accountRecordViewModel.getAllAcountRecord().observe(this, new Observer<List<AccountRecord>>() {
@Override
public void onChanged(List<AccountRecord> accountRecords) {
StringBuilder text = new StringBuilder();
for (int i=0;i<accountRecords.size();i++){
AccountRecord accountRecord = accountRecords.get(i);
text.append(accountRecord.getId()).append(" ").append(accountRecord.getCostType()).append(" ").append(accountRecord.getCostTime()).append(" ").append(accountRecord.getCostMoney()).append("\n");
}
textView.setText(text.toString());
}
});

2、引入ViewModel管理数据、使MainActive 只管理界面、不再管数据了

1)、仓库类操作数据库

package com.me.familybookkeepingbook;

import android.content.Context;
import android.os.AsyncTask; import androidx.lifecycle.LiveData; import java.util.List; public class AccountRecordRepository {
private LiveData<List<AccountRecord>> allAcountRecord;
private AccountRecordDao accountRecordDao;
public AccountRecordRepository(Context context) {
AccountRecordDatabase accountRecordDatabase = AccountRecordDatabase.getAccountRecordDataBase(context.getApplicationContext());
accountRecordDao = accountRecordDatabase.getAccountRecordDao();
allAcountRecord = accountRecordDao.getAllAccountRecordLive();
} public LiveData<List<AccountRecord>> getAllAcountRecord() {
return allAcountRecord;
}
void insertAccountRecord(AccountRecord ... accountRecords){
new InsertAsyncTask(accountRecordDao).execute(accountRecords);
}
void deleteAllAccountRecord(){
new DeleteAsyncTask(accountRecordDao).execute();
}
static class InsertAsyncTask extends AsyncTask<AccountRecord ,Void,Void> {
private AccountRecordDao accountRecordDao; public InsertAsyncTask(AccountRecordDao accountRecordDao) {
this.accountRecordDao = accountRecordDao;
} @Override
protected Void doInBackground(AccountRecord... accountRecords) {
accountRecordDao.insertAccountRecord(accountRecords);
return null;
}
}
static class DeleteAsyncTask extends AsyncTask<Void ,Void,Void>{
private AccountRecordDao accountRecordDao; public DeleteAsyncTask(AccountRecordDao accountRecordDao) {
this.accountRecordDao = accountRecordDao;
} @Override
protected Void doInBackground(Void... Voids) {
accountRecordDao.deleteAllAccountRecord();
return null;
}
}
}

2)、ViewModel管理数据

package com.me.familybookkeepingbook;

import android.app.Application;
import android.os.AsyncTask; import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData; import java.util.List; public class AccountRecordViewModel extends AndroidViewModel {
private AccountRecordRepository accountRecordRepository;
public AccountRecordViewModel(@NonNull Application application) {
super(application);
accountRecordRepository = new AccountRecordRepository(application);
} public LiveData<List<AccountRecord>> getAllAcountRecord() {
return accountRecordRepository.getAllAcountRecord();
} void insertAccountRecord(AccountRecord ... accountRecords){
accountRecordRepository.insertAccountRecord(accountRecords);
}
void deleteAllAccountRecord(){
accountRecordRepository.deleteAllAccountRecord();
}
static class InsertAsyncTask extends AsyncTask<AccountRecord ,Void,Void> {
private AccountRecordDao accountRecordDao; public InsertAsyncTask(AccountRecordDao accountRecordDao) {
this.accountRecordDao = accountRecordDao;
} @Override
protected Void doInBackground(AccountRecord... accountRecords) {
accountRecordDao.insertAccountRecord(accountRecords);
return null;
}
}
static class DeleteAsyncTask extends AsyncTask<Void ,Void,Void>{
private AccountRecordDao accountRecordDao; public DeleteAsyncTask(AccountRecordDao accountRecordDao) {
this.accountRecordDao = accountRecordDao;
} @Override
protected Void doInBackground(Void... Voids) {
accountRecordDao.deleteAllAccountRecord();
return null;
}
}
}

3)、MainActive 管理界面

package com.me.familybookkeepingbook;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders; import java.util.List; public class MainActivity extends AppCompatActivity {
AccountRecordViewModel accountRecordViewModel;
Button buttonInsert,buttonDelete;
TextView textView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
accountRecordViewModel = ViewModelProviders.of(this).get(AccountRecordViewModel.class);
textView = findViewById(R.id.textView);
buttonDelete = findViewById(R.id.buttonDelete);
buttonInsert = findViewById(R.id.buttonInsert);
accountRecordViewModel.getAllAcountRecord().observe(this, new Observer<List<AccountRecord>>() {
@Override
public void onChanged(List<AccountRecord> accountRecords) {
StringBuilder text = new StringBuilder();
for (int i=0;i<accountRecords.size();i++){
AccountRecord accountRecord = accountRecords.get(i);
text.append(accountRecord.getId()).append(" ").append(accountRecord.getCostType()).append(" ").append(accountRecord.getCostTime()).append(" ").append(accountRecord.getCostMoney()).append("\n");
}
textView.setText(text.toString());
}
});
buttonInsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AccountRecord accountRecord = new AccountRecord(1,"2020-01-26","学习",100.0);
accountRecordViewModel.insertAccountRecord(accountRecord);
}
});
buttonDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
accountRecordViewModel.deleteAllAccountRecord();
}
});
} }

3、引入AsyncTask、后台执行。不必强制在主线程执行

static class InsertAsyncTask extends AsyncTask<AccountRecord ,Void,Void> {
private AccountRecordDao accountRecordDao; public InsertAsyncTask(AccountRecordDao accountRecordDao) {
this.accountRecordDao = accountRecordDao;
} @Override
protected Void doInBackground(AccountRecord... accountRecords) {
accountRecordDao.insertAccountRecord(accountRecords);
return null;
}
}
static class DeleteAsyncTask extends AsyncTask<Void ,Void,Void>{
private AccountRecordDao accountRecordDao; public DeleteAsyncTask(AccountRecordDao accountRecordDao) {
this.accountRecordDao = accountRecordDao;
} @Override
protected Void doInBackground(Void... Voids) {
accountRecordDao.deleteAllAccountRecord();
return null;
}
}

4、将Database.java修改为singleton模式、只维护一个Database

package com.me.familybookkeepingbook;

import android.content.Context;

import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
@Database(entities = {AccountRecord.class },version = 1,exportSchema = false)
public abstract class AccountRecordDatabase extends RoomDatabase {
private static AccountRecordDatabase INSTANCE;
public abstract AccountRecordDao getAccountRecordDao();
static synchronized AccountRecordDatabase getAccountRecordDataBase(Context context){
if (INSTANCE == null){
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),AccountRecordDatabase.class,"accountrecord_database")
.build();
}
return INSTANCE;
} }

最新文章

  1. 关于&lt;head&gt;&lt;/head&gt;标签;&lt;form&gt;&lt;/form&gt;标签
  2. Cocos2d-x 3.2 学习笔记(十五)保卫萝卜 场景与数据
  3. CSS选择器、优先级与匹配原理(转)
  4. Linux 系统时间查看 及 时区修改(自动同步时间)
  5. Thinkphp 使用gmail发送邮件
  6. 未能导入activex控件,请确保它正确注册
  7. 如何判断CPU的位数
  8. BZOJ 3011: [Usaco2012 Dec]Running Away From the Barn( dfs序 + 主席树 )
  9. thinkphp URL规则、URL伪静态、URL路由、URL重写、URL生成(十五)
  10. 攻入Javascript,究竟什么是AJAX
  11. Mac和Windows系统下Mysql数据库的导入导出
  12. 《修改代码的艺术》【PDF】下载
  13. ansible playbook实践(三)-yaml文件写法
  14. 手把手带你画一个漂亮蜂窝view Android自定义view
  15. R画网络图
  16. golang中数组与切片的区别
  17. JavaScript:几种常用循环
  18. POJ 1180 - Batch Scheduling - [斜率DP]
  19. 06_常用 Linux 命令的基本使用
  20. 执行shell脚本时提示bad interpreter:No such file or directory的解决办法

热门文章

  1. AndroidQ强势来袭,国产自研系统还有未来吗?
  2. js 用于运行string中的&lt;script&gt;和&lt;/script&gt;之间的函数
  3. SSH框架与SSI框架的区别
  4. PostGIS官方教程汇总目录
  5. 强制找回GitLab管理员账户密码的方法
  6. zigbee CC2530首选方案模组:TZU06A1
  7. 使用JS写一个计算器
  8. Day4 - J - Rank of Tetris HDU - 1811
  9. Spring Boot-运行部署
  10. Flask—核心对象app初步理解