Rxjava2_Flowable_Sqlite_Android数据库访问

本文探讨了使用RxJava2访问Android SQLite数据库的优势,并详细介绍了如何通过原生SQLite和sqlbrite两种方式实现数据库操作。文章还展示了如何通过lambda表达式简化数据库调用代码,提供了一种在build.gradle中进行配置的方法来进一步优化。
摘要由CSDN通过智能技术生成

一、使用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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值