前言

关于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的Maybe,Single或Flowable。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

Room and Rxjava2相关推荐

  1. flux java_FluxJava 新增 RxJava2 的支援功能

    FluxJava 最初的设计就是以 Add-on 的方式来提供对于 RxJava 的支持,所以这次增加 RxJava2 的部份也依照相同的模式,在 Project 中加上了 fluxjava-rx2 ...

  2. RxJava2 / RxAndroid2的merge操作合并多个Observable

    RxJava2/RxAndroid2的merge操作合并多个Observable RxAndroid2/RxJava2的merge操作合并若干个Observable为单个可观测的Observable, ...

  3. Android每周一个学习计划——RxJava2 0的学习使用

    序言:蜗壳已经退役一年多了,但是还是抵不住蜗壳在NBA界的影响力,最近NBA流行向"蜗壳挑战",事情起源于蜗壳给IT和北境之王设定了新赛季的挑战,然后众多球星也纷纷向蜗壳讨要挑战. ...

  4. java二次封装_基于OKhttp+Rxjava2+Retrofit进行二次封装

    概述 基于Retrofit进行二次封装,优雅的初始化设置.基于Okhttp拦截器和基础缓存,封装了无网络和其他所有场景的缓存策略支持,以及频繁调用请求的丢弃策略. 特性 1.基于Retrofit的二次 ...

  5. 如何从RxJava升级到RxJava2

    如何从RxJava升级到RxJava2. RxJava2已经推出有一年半的时间,由于之前RxJava已经在现有项目中广泛使用,而RxJava2在除了很多命名外并没有太多革新,所以相信有很多人跟我一样都 ...

  6. java concat和 的区别,RxJava2 merge和concat 区别

    merge merge 将全部订阅 Observable,但是谁先完成谁先通知,如果大家完成时间一样,按顺序调用 public static void rxJava2() { Observable.m ...

  7. Android rxjava2的disposable

    rxjava+retrofit处理网络请求 在使用rxjava+retrofit处理网络请求的时候,一般会采用对观察者进行封装,实现代码复用和拓展.可以参考我的这篇文章:rxjava2+retrofi ...

  8. 图解RxJava2(一)

    前言 从这篇文章开始,系统地学习RxJava2设计思想和源码实现.说起大热门RxJava,网上有很多例如响应式编程.观察者模式等介绍,也有一些优秀的文章以上.下游等概念引初学者入门,在初步学习之后,可 ...

  9. RxAndroid2 / RxJava2简单的CompletableObserver

    RxAndroid2 / RxJava2简单的CompletableObserver CompletableObserver简单的用法跟踪一个任务的结束,不处理复杂的数据传导,例如: package ...

  10. android上传头像 sockettimeoutexception,Kotlin - Retrofit2和Rxjava2封装的网络请求类(含图片上传)...

    阅读建议:本文适合熟悉Retrofit与Rxjava2的同学阅读,其中也包含一丢丢的RxLifecycle,文中不包含这两个库的使用说明.不熟悉RxJava的同学,建议去这里了解,里面包含3篇文章,均 ...

最新文章

  1. 虚拟化厂商VMware、微软和思杰的vGPU支持概述
  2. 2.7 HBase架构深入剖析
  3. 大型Java项目架构演进
  4. Loj2687,jzoj3320-文本编辑器【线头dp】
  5. 计算线段长度(信息学奥赛一本通-T1033)
  6. 谢宝友:会说话的Linux内核
  7. 计算机应用技术老师全国计算机应用技术考试,全国计算机应用证书 全国计算机应用技术证书考试作业.doc...
  8. OpenCV能调用的摄像头类型
  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_2_一切皆为字节...
  10. 怎么判断前轮左右的位置_老司机教你如何用方向盘,判断左右车轮位置,新手司机一看就会!...
  11. 使用Pycharm安装numpy库
  12. vscode设置中文流程
  13. cass道路设计教程_(完整版)南方CASS7.1绘制道路断面图教程
  14. 各层电子数排布规则_电子数的排布规律是什么?
  15. 计算机服务无法启动,Win7系统下windows firewall服务无法启动怎么解决【图文】
  16. 点击电脑桌面图标就点计算机图标老是出现是否删除快捷方式,电脑桌面上的快捷方式图标总是有小箭头怎么删掉...
  17. english need study and insist 1
  18. java实验作业:银行账户
  19. 图片按指定比例缩放并压缩至指定大小,解决保存图片文件体积过大bug。
  20. 直播预告 | 端云协同的淘宝机器学习系统

热门文章

  1. 如何设计一个好的Windows 8应用
  2. 通过SQL一键解析表字段血缘关系
  3. 数据中心解决方案-最新全套文件
  4. AI学习之路(4): TensorFlow是什么
  5. 【VScode】创建用户代码片段(以React.jsx文件为例)
  6. 快递查询接口 常用快递单号查询API示例分享
  7. Data fountain 基于人工智能的恶意软件家族分类 参赛总结
  8. python2.7安装requests linux_win与linux系统中python requests 安装
  9. PHP7新特性和废弃的函数
  10. 企业IM是什么,有什么使用优势?