Room & Rxjava
Room是google在Architecture Components
提出的一个持久化库,可以异步查询返回LiveData和Rxjava里的Maybe,Single,Flowable,其中LiveData和Flowable是可观测的查询。它们允许自动从数据库更新数据,从而刷新UI。
可以在UserDao里这么写,
1 | @Query(“SELECT * FROM Users WHERE id = :userId”) |
但他有两个缺点:
1、这是同步的,所以会阻塞。
2、当user被修改的时候,我们总是需要手动调用这个方法。
在返回Maybe或Single的时候,确保subscribeOn
调用了Scheduler
的不同线程,而不是AndroidSchedulers.mainThread()
若想加上room对rxjava的支持,需要在build.gradle
中添加以下内容
1 | // RxJava support for Room |
#Maybe
1 | @Query(“SELECT * FROM Users WHERE id = :userId”) |
来说说发生了啥:
1、当数据库里没有这条数据的时候,Maybe
会直接onComplete()
。
2、当有这条数据的时候,Maybe
会触发onSuccess
,然后会正常的onComplete()
。
3、当数据在Maybe
的onCompleted()
后进行了更新,那就什么都不会发生了。
#Single
1 | @Query(“SELECT * FROM Users WHERE id = :userId”) |
1、当数据库里没有这条数据的时候,Single
会直接onError(EmptyResultSetException.class)
。
2、当有这条数据的时候,Single
会触发onSuccess
。
3、当数据在Single.onCompleted()
后进行了更新,那就什么都不会发生了,自流被关闭后。
#Flowable
1 | @Query(“SELECT * FROM Users WHERE id = :userId”) |
1、当数据库里没有这条数据的时候,Flowable
不会发射,当然也就不会有onNext
和onError
。
2、当有这条数据的时候,Flowable
会触发onNext
。
3、任何时候数据被更新了,Flowable
会自动发射来让你用最新的数据来更新UI。
Room and RxJava , google写了个简单的 例子
over~