【Android】家庭记账本手机版开发报告二
一、说在前面
| 昨天 | 完成了对记账本的账单的增删 |
| 今天 |
完善昨天的框架结构( 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】家庭记账本手机版开发报告二的更多相关文章
- 【Android】家庭记账本手机版开发报告五
一.说在前面 昨天 1.添加菜单(查询.清除所有等)2.使用滑动删除 今天 1.创建登入和注册界面 2.向数据库添加一张用户表 问题 做完后在登入时有bug(未解决) 二.界面的搭建 1 ...
- 【Android】家庭记账本手机版开发报告一
一.说在前面 昨天 学习了数据库的一些简单操作 今天 使用数据库,完成对记账本的账单记录的增删 问题 没有 二.数据库 1.账单表的结构 (注 id:账单的唯一标识,uid:记录账单的用户的id,co ...
- 【Android】家庭记账本手机版开发报告七
一.说在前面 昨天 实现了账单的图标显示 今天 本地化,测试APP,将工程源码放到github上 源码:https://github.com/xiaotian12-call/Android_Boo ...
- 【Android】家庭记账本手机版开发报告六
一.说在前面 昨天 1.创建登入和注册界面:2.向数据库添加一张用户表 今天 用图标显示账单情况 问题 1.使用第三方库 hellochart,时添加依赖构建失败 2.在 chertFragmen ...
- 【Android】家庭记账本手机版开发报告四
一.说在前面 昨天 对界面显示和逻辑结构进行完善 今天 1.添加菜单(查询.清除所有等) 2.使用滑动删除 问题 1.在做查询时获取SearchView时引 入包错误经过长时间的尝试后才修正 2.滑动 ...
- 【Android】家庭记账本手机版开发报告三
一.说在前面 昨天 对第一天的框架结构进行了四方面的完善 今天 对界面显示和逻辑结构进行完善 问题 无 二.界面展示完善 1.使用可回收的列表recyclerView展示账单的信息,并设置数据项为卡片 ...
- 手机版地图api
手机版地图api一: <iframe style="height:300px;" src="http://map.baidu.com/mobile/webapp/s ...
- WPS Office手机版调用接口代码指导帖之一(Android)
经常会有一些喜欢开发鼓捣的童鞋问我们,WPS Office手机版是否提供调用接口,希望在android中使用一个调用命令,直接调用WPS手机版来打开指定的DOC文件,而不用弹出一个程序可选列表(如果用 ...
- 手机版WEB开发经验分享,手机版网站开发注意事项,网站自适应,手机版网站自适应,移动安卓APP自适应
转自 http://my.oschina.net/cart/blog/282477 做前端开发不短了,用过jQuery Mobile jqMobi 也纯手工写过.. 最后总结如下: jQuery Mo ...
随机推荐
- DeepLearning算法文章
算法源码: learn_dl : https://github.com/hanbt/learn_dl rnn-from-scratch : https://github.com/pangolulu/r ...
- Linux centosVMware Vim介绍、vim颜色显示和移动光标、vim一般模式下移动光标、vim一般模式下复制、剪切和粘贴
一.Vim介绍 vim 是一款功能强大的文本编辑器,是vi的升级版,带有颜色显示, 默认有三种模式:一般模式, 命令模式, 编辑模式 安装Vim [root@davery ~]# vim /et ...
- 题解:luogu P3909
这个题拖了快三个月了,只因缺个快速乘(气愤.jpg). 题目链接:P3909 异或之积 你确定没人用前缀和,后缀和吗? 蒟蒻想法与众不同! 我们实验\(A[]={1,2,3,4}\). 这里计不乘6时 ...
- Day10 - 灾难 HYSBZ - 2815
Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生 ...
- 最短路径问题:Dijkstra算法
定义 所谓最短路径问题是指:如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小. 下面我们介绍两种比较常用的求最短路 ...
- Gradient descend 梯度下降法和归一化、python中的实现(未完善)
梯度下降法是优化函数参数最常用.简单的算法 通常就是将一组输入样本的特征$x^i$传入目标函数中,如$f(x) = wx + b$,再计算每个样本通过函数预测的值$f(x^i)$与其真实值(标签)$y ...
- 玩玩负载均衡---在window与linux下配置nginx
最近有些时间,开始接触负载均衡方面的东西,从硬件F5再到Citrix Netscalar.不过因为硬件的配置虽然不复杂,但昂贵的价格也让一般用户望而却步(十几万到几十万),所以只能转向nginx, ...
- 吴裕雄--天生自然JAVA数据库编程:SQL常用语句基础
DROP TABLE user ; -- 删除表 CREATE TABLE user( id INT AUTO_INCREMENT PRIMARY KEY , name ) NOT NULL , pa ...
- 编程题目:输入一个链表,输出该链表中倒数第k个节点
两种方法 1.在链表的初始化数据中加入 num 数据, 每添加一个节点,num加1,每删除一个节点,num减1 查找倒数第k个元素,即 指向第一个节点的指针向后移动 num - k 步. 2.使用两个 ...
- tomcat多实例配置
有一台server上跑个tomcat的实例的情况,我遇到过这种情况,毕竟把多个应用部署到一个实例中,如果某个应用出了问题,导致tomcat奔溃,其他应用也gg了.闲话到此. 通常部署多实例就是解压多个 ...