一、使用Rxjava访问数据库的优点:
1.随意的线程控制,数据库操作在一个线程,返回数据处理在ui线程2.随时订阅和取消订阅,而不必再使用回调函数
3.对读取的数据用rxjava进行过滤,流式处理
4.使用sqlbrite可以原生返回rxjava的格式,同时是响应式数据库框架
(有数据添加和更新时自动调用之前订阅了的读取函数,达到有数据添加自动更新ui的效果,
同时这个特性没有禁止的方法,只能通过取消订阅停止这个功能,对于有的框架这反而是一种累赘)
二、接下来之关注实现过程:
本次实现用rxjava2的Flowable,有被压支持(在不需要被压支持的情况建议使用Observable)实现一个稳健的的可灵活切换其他数据库的结构,当然是先定义数据库访问接口。然后跟具不同的数据库实现接口的方法
定义接口:(对于update,delete,insert,可以选择void类型,来简化调用代码,但缺少了执行结果判断)
public interface DbSource {
//String sql = "insert into table_task (tid,startts) values(tid,startts)";
Flowable<Boolean> insertNewTask(int tid, int startts);
//String sql = "select * from table_task";
Flowable<List<TaskItem>> getAllTask();
//String sql = "select * from table_task where endts = 0";
Flowable<Optional<TaskItem>> getRunningTask();
//String sql = "update table_task set isuploadend=isuploadend where tid=tid";
Flowable<Boolean> markUploadEnd(int tid, boolean isuploadend);
//String sql = "delete from table_task where tid=tid and endts>0";
Flowable<Boolean> deleteTask(int tid);
}
三、用Android原生的Sqlite实现数据库操作
public class SimpleDb implements DbSource {
private static SimpleDb sqlite;
private SqliteHelper sqliteHelper;
private SimpleDb(Context context) {
this.sqliteHelper = new SqliteHelper(context);
}
public static synchronized SimpleDb getInstance(Context context) {
if (sqlite == null )
sqlite = new SimpleDb(context);
return sqlite;
}
Flowable<Boolean> insertNewTask(int tid, int startts) {
return Flowable.create(new FlowableOnSubscribe<Boolean>() {
@Override
public void subscribe(FlowableEmitter<Boolean> e) throws Exception {
//这里数据库操作只做示例代码,主要关注rxjava的Flowable使用方法
ContentValues values = new ContentValues();
values.put(“tid”, 1);
values.put(“startts”,13233);
if(sqliteHelper.getWriteableDatabase().insert(TABLE_NAME, null, values) != -1)
e.onNext(true);
else
e.onNext(false);
e.onComplete();
}
}, BackpressureStrategy.BUFFER);
}
Flowable<List<TaskItem>> getAllTask() {
return Flowable.create(new FlowableOnSubscribe<List<TaskItem>>() {
@Override
public void subscribe(FlowableEmitter<List<TaskItem>> e) throws Exception {
List<TaskIt