Rxjava 操作数据库是如此简单

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/arson663300/article/details/78989227

先前有写过基于Rxjava+Retrofit获取网络数据,有时数据源来自本地数据库,读写数据库也是耗时操作。既然mvp+Rxjava的封装适用于网络数据,是否适用于数据库的操作呢? 这几天也查看了相关的资料,没有看到一针见血的文章。细细看来,其实也很简单。只需要改一行代码就可以搞定!
Retrofit的封装过程可以参考先前的文章:安卓框架搭建之MVP+Retrofit+RxJava基础:,这里先给出访问网络数据的关键代码(下面方法在presenter内):

 @Override
    public void getTestData(int start, int count) {
        //获取数据
        HashMap<String, String> map = new HashMap<>();
        map.put("start", StringUtils.getString(start));
        map.put("count", StringUtils.getString(count));
        Observable<MovieListBean> observable = RetrofitManager.getInstace().create(ApiService.class).getMovieListData(map).map((new HttpResultFunc<MovieListBean>()));
        Subscription rxSubscription = new ProgressSubscriber<>(new SubscriberOnResponseListenter<MovieListBean>() {
            @Override
            public void next(MovieListBean testBean) {
                mView.setTestBeanData(testBean);
            }

            @Override
            public void error(BaseResultBean errResponse) {
                mView.showError(errResponse);
            }
        }, mContext, false);
        RetrofitManager.toSubscribe(observable, (Subscriber) rxSubscription);
        addSubscrebe(rxSubscription);
    }

网络请求

①、②、③是RxJava三个主要模块
①Observable 被观察者,即需要在工作线程中执行的任务
②Subscription 观察者,继承自Observer,设置了监听回 调的方法
③订阅的执行和周期管理
在上面的代码中,被观察者是网络数据。而观察者除了返回类型,其他是不需要改变的, 第三点的订阅执行和周期管理也是固定不变的

用RxJava操作数据库,说白了,就是新建一个Observable ,且在Observable 内执行操作数据库的代码。也就是我前面提到的改一行代码就能搞定。下面是插入数据到数据库的代码(在presenter内):

    @Override
    public void insertUser2Db(UserBean bean) {
        //插入数据库,返回是否插入成功
        Observable<Boolean> observable = DBManager.getInstace().insertUser(bean);
        Subscription rxSubscription = new ProgressSubscriber<>(new SubscriberOnResponseListenter<Boolean>() {
            @Override
            public void next(Boolean isSuccess) {
                mView.doInsertDb(isSuccess);
            }
            @Override
            public void error(BaseResultBean errResponse) {
                mView.showError(errResponse);
            }
        }, mContext);
        FileRetrofitManager.toSubscribe(observable, (Subscriber) rxSubscription);
        addSubscrebe(rxSubscription);
    }

插入数据库
②、③不变,只是把①和数据库的操作相关联

那么下面的重点是Observable 对象与操作数据库如何结合

    public Observable<Boolean> insertUser(final UserBean userBean) {
        return Observable.create(new Observable.OnSubscribe<Boolean>() {
            @Override
            public void call(Subscriber<? super Boolean> subscriber) {
                subscriber.onStart();
                if (userBean != null) {
                    ContentValues values = new ContentValues();
                    values.put("name", userBean.getName());
                    values.put("number", userBean.getNumber());
                    //插入数据库失败为-1
                    if (DBHelper.insertData(DBHelper.USER_TABLE, values) != -1) {
                        subscriber.onNext(true);
                    } else {
                        subscriber.onNext(false);
                    }
                    subscriber.onCompleted();
                } else {
                    subscriber.onNext(false);
                    subscriber.onCompleted();
                }
            }
        });
    }

Observable对象的建造很简单,传入相关的参数/类型,重写call()方法,并根据读写完成情况,执行subscriber【观察者】的相关方法。

这样一来,基于目前的框架结构。只需要做小小的改动。就能完美的利用Rxjava操作数据库。不仅仅是数据库。其他类似的耗时操作。也都可以使用这个套路。最近越来越觉得RXjava框架简约而不简单~

阅读更多

没有更多推荐了,返回首页