Room and Rxjava2

前言

关于Room的介绍和基本操作,请看我的这篇文章Room of Jetpack's Architecture Components

rxjava特点

先来简单介绍一下这几个属于RxJava的对象的特点。

  1. Completable:只有onComplete和onError方法,即是只有“完成”和“错误”两种状态,不会返回具体的结果。
  2. Single:其回调为onSuccess和onError,查询成功会在onSuccess中返回结果,需要注意的是,如果未查询到结果,即查询结果为空,会直接走onError回调,抛出EmptyResultSetException异常。
  3. Maybe:其回调为onSuccess,onError,onComplete,查询成功,如果有数据,会先回调onSuccess再回调onComplete,如果没有数据,则会直接回调onComplete。
  4. Flowable/Observable:这俩相信不用多介绍了,这是返回一个可观察的对象,每当查询语句查询的部分有变化时,都会回调它的onNext方法,直到Rx流断开。

使用Room的好处

  1. 更少的样板代码
  2. 编译时检查的SQL查询
  3. 异步和可观察查询的功能

所有这些都可以通过Room(来自架构组件的持久性库)来实现。异步查询返回LiveData或RxJava的MaybeSingleFlowable。LiveData和Flowable的查询是可观察,它们可以在数据更改时自动进行更新,以确保UI响应数据库中的最新值。如果您已经在你的应用程序中使用RxJava 2,然后使用Room的MaybeSingleFlowable将变得轻而易举。

考虑以下UI:用户能够查看和编辑其用户名。这和有关用户的其他信息一起保存在数据库中。这是插入,更新,删除和查询用户的方法。

Insert

Room集成RxJava允许以下相应的插入返回类型:

  • Completable— 插入完成后onComplete立即被调用
  • Single<Long>Maybe<Long>-onSuccess发送的值是插入的项目的行id
  • Single<List<Long>>Maybe<List<Long>>-onSuccess发送的值是插入的项目的行id的列表

如果在插入数据时出错,CompletableSingleMaybe将在onError中发送异常。

@Insert
fun insert(user: User): Completable

@Insert
fun insert(user: User): Single<Long>

@Insert
fun insert(user: User): Maybe<Long>

@Insert
fun insert(vararg users: User): Single<List<Long>>

@Insert
fun insert(vararg users: User): Maybe<List<Long>>

@Query("INSERT INTO user VALUES(:firstName, :lastName, :age)")
fun insert(firstName: String, lastName: String, age: Int): Single<Long>

@Query("INSERT INTO user VALUES(:firstName, :lastName, :age)")
fun insert(firstName: String, lastName: String, age: Int): Maybe<Long>
  1. 返回的类型是Long也只能是Long,否则无法通过编译。
  2. 返回的Long值,是指的插入的行id。
  3. 使用observeOn操作符指定Observer在哪个Scheduler上观察ObservablesubscribeOn操作符指定Observable会运行在哪个Scheduler上。

Update/Delete

Room集成RxJava允许以下相应的插入返回类型:

  • Completable— 更新/删除完成后onComplete立即被调用
  • Single<Integer>Maybe<Integer>-其中onSuccess上发送的值是受更新/删除影响的行数
@Update/Delete
fun insert(user: User): Completable

@Update/Delete
fun insert(user: User): Single<Int>

@Update/Delete
fun insert(user: User): Maybe<Int>

@Update/Delete
fun insert(vararg users: User): Single<List<Int>>

@Update/Delete
fun insert(vararg users: User): Maybe<List<Int>>

@Query("UPDATE user SET firstname = :firstName WHERE age = :age")
fun updateFirstName(age: Int, firstName: String): Single<List<Int>>

@Query("UPDATE user SET firstname = :firstName WHERE age = :age")
fun updateFirstName(age: Int, firstName: String): Maybe<List<Int>>

注意:

  1. 返回的类型为Integer也只能是Integer,否则无法通过编译。
  2. 返回的Integer值,指的是该次操作影响到的总行数,比如该次操作更新了5条,就返回5

Query

为了从数据库中获取用户,我们可以在数据访问对象类(UserDao)中编写以下查询:

@Query(“SELECT * FROM Users WHERE id = :userId”)
User getUserById(String userId);

这种方法有两个缺点:

  1. 这是一个阻塞的同步调用
  2. 每次修改用户数据时,我们都需要手动调用此方法

Room提供了观察数据库数据和通过Rxjava的Maybe、Single、Flowable的帮助下执行异步查询的选项,如果您担心线程,Room可让您放心,并确保在主线程之外进行可观察的查询。您可以通过在observeOn方法中设置Scheduler来决定事件在哪个线程上向下游发出

Maybe

@Query(“SELECT * FROM Users WHERE id = :userId”)
Maybe<User> getUserById(String userId);
  1. 数据库中没有用户并且查询不返回任何行时,MaybeonComplete
  2. 数据库中一个用户时Maybe将触发**onSuccess**onComplete
  3. 如果Maybe在**onComplete更新用户**,则不会发生任何事情

Single

@Query(“SELECT * FROM Users WHERE id = :userId”)
Single<User> getUserById(String userId);
  1. 数据库中没有用户并且查询不返回任何行时,Single将触发**onError(EmptyResultSetException.class)**
  2. 数据库中一个用户时Single将触发**onSuccess**
  3. 如果SingleonComplete更新用户,则不会发生任何事情

Flowable/Observable

@Query(“SELECT * FROM Users WHERE id = :userId”)
Flowable<User> getUserById(String userId);
  1. 数据库中没有用户并且查询不返回任何行,则**Flowable***不会发送,既没有onNext,也不是onError
  2. 数据库中一个用户时Flowable将触发**onNext**
  3. 每次更新用户数据时,该Flowable对象都会自动发出,从而使您可以基于最新数据来更新UI。

参考链接:

Room配合RxJava2,使用方法兼使用心得兼注意事项

Room 🔗 RxJava

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值