一、说在前面

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

完善昨天的框架结构(

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;
} }

【Android】家庭记账本手机版开发报告二的更多相关文章

  1. 【Android】家庭记账本手机版开发报告五

    一.说在前面   昨天  1.添加菜单(查询.清除所有等)2.使用滑动删除   今天 1.创建登入和注册界面 2.向数据库添加一张用户表   问题 做完后在登入时有bug(未解决) 二.界面的搭建 1 ...

  2. 【Android】家庭记账本手机版开发报告一

    一.说在前面 昨天 学习了数据库的一些简单操作 今天 使用数据库,完成对记账本的账单记录的增删 问题 没有 二.数据库 1.账单表的结构 (注 id:账单的唯一标识,uid:记录账单的用户的id,co ...

  3. 【Android】家庭记账本手机版开发报告七

    一.说在前面  昨天 实现了账单的图标显示  今天 本地化,测试APP,将工程源码放到github上 源码:https://github.com/xiaotian12-call/Android_Boo ...

  4. 【Android】家庭记账本手机版开发报告六

    一.说在前面  昨天 1.创建登入和注册界面:2.向数据库添加一张用户表  今天 用图标显示账单情况 问题 1.使用第三方库 hellochart,时添加依赖构建失败 2.在 chertFragmen ...

  5. 【Android】家庭记账本手机版开发报告四

    一.说在前面 昨天 对界面显示和逻辑结构进行完善 今天 1.添加菜单(查询.清除所有等) 2.使用滑动删除 问题 1.在做查询时获取SearchView时引 入包错误经过长时间的尝试后才修正 2.滑动 ...

  6. 【Android】家庭记账本手机版开发报告三

    一.说在前面 昨天 对第一天的框架结构进行了四方面的完善 今天 对界面显示和逻辑结构进行完善 问题 无 二.界面展示完善 1.使用可回收的列表recyclerView展示账单的信息,并设置数据项为卡片 ...

  7. 手机版地图api

    手机版地图api一: <iframe style="height:300px;" src="http://map.baidu.com/mobile/webapp/s ...

  8. WPS Office手机版调用接口代码指导帖之一(Android)

    经常会有一些喜欢开发鼓捣的童鞋问我们,WPS Office手机版是否提供调用接口,希望在android中使用一个调用命令,直接调用WPS手机版来打开指定的DOC文件,而不用弹出一个程序可选列表(如果用 ...

  9. 手机版WEB开发经验分享,手机版网站开发注意事项,网站自适应,手机版网站自适应,移动安卓APP自适应

    转自 http://my.oschina.net/cart/blog/282477 做前端开发不短了,用过jQuery Mobile jqMobi 也纯手工写过.. 最后总结如下: jQuery Mo ...

随机推荐

  1. 新闻网大数据实时分析可视化系统项目——11、MySQL安装

    1.修改yum源 鉴于用国外的Yum源,速度比较慢,所以想到将国外的yum源改为国内的Yum源,这里选择使用比较多的阿里云源.具体修改方法可以参考此连接 2.在线安装mysql 通过yum在线mysq ...

  2. .net高手:forms验证中中<forms loginUrl="" defaultUrl="">defaulturl和loginurl的区别

    .net高手:forms验证中中<forms  loginUrl="" defaultUrl="">defaulturl和loginurl的区别 d ...

  3. IDEA配置数据库连接失败的问题

    今天采用IDEA连接数据库失败了,有几个问题需要注意 首先笔者采用的数据库版本为8.0.17而IDEA自带版本是5.2.26大概,于是首先出现的问题是驱动不匹配,那么就需要换成我自己的版本,配置如下 ...

  4. ExpandableListActivity

    main.xml: <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:an ...

  5. Ajax--XMLHttpRequest的使用

    1.创建XMLHttpRequest对象(实现方法不统一): --IE把XMLHttpRequest实现为一个ActiveX对象: --其他浏览器(Firefox.Chrome等)把它实现为一个本地的 ...

  6. 45 孩子们的游戏(圆圈中最后剩下的数) + list操作总结+ for_each多记忆容易忘记

    题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...

  7. Flask与Django哪个更好更实用呢?砖家是这么认为的

        这一周我打算做一个 Flask 教程.本文先把 Flask 和 Django 做一个比对,因为我对这两个 Python Web 框架都有实际的开发经验.希望我可以帮助您选择学习哪个框架,因为学 ...

  8. PHP+MySQL实现在线测试答题实例

    这个实例主要给大家介绍如何使用jQuery+PHP+MySQL来实现在线测试题,包括动态读取题目,答题完毕后台评分,并返回答题结果. 读取答题列表: $sql = "select * fro ...

  9. 学习:java原理—反射机制

      一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提 出很快引发了计算机科学领域关于应用反射性的研究.它首先被程 ...

  10. springboot2.1mysql驱动类弃用

    Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdb ...