实战 | 在 Room 中使用 Flow

2020 年 7 月 5 日 谷歌开发者

Room 中对 Flow 的支持

Jetpack Room 对协程的支持越来越丰富: Room 2.1 版本增加了对协程的支持,并加入了一次性 (one-shot) 的读写操作,Room 2.2 我们通过 Flow 为读操作加入了可观察性,当数据库中的数据有变化时它可以使您收到通知。

Room 支持异步 query 操作

  • Flow
    https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/



Flow 实战


假设我们有一个记录小狗信息的数据库,它的 name 字段是主键 (primary key),所以在数据库中不可能同时有两个 name 字段相同的数据,也就是每只小狗都是唯一的。
@Entitydata class Dog (    @PrimaryKey val name: String,    val cuteness: Int,    val barkingVolume: Int)


为了从数据中获取一个包含所有小狗信息的总表,我们在 DAO 中编写如下 query 语句:

@Query("SELECT * FROM Dog")fun getAllDogs(): List<Dog>

  • DAO
    https://developer.android.google.cn/training/data-storage/room/accessing-data


因为小狗的叫声,也就是字段 barkingVolume 会随着时间变化,并且我们想确保 UI 展示的内容是最新的。因此我们希望,当数据库中的数据有变化时,可以通知到我们: 比如新增,删除,或者是更新了数据。


为了实现这个功能,我们通过更新 query 操作返回一个 Flow 对象。

@Query("SELECT * FROM Dog")fun getAllDogs(): Flow<List<Dog>>


就像这样,每当数据库中的数据有更新时,会重新派发存有小狗信息的总表。例如,假设我们的数据库中存有如下数据:

(Frida, 11, 3)(Bandit, 12, 5)


第一次调用 getAllDogs 时 Flow 派发的数据如下:

[(Frida, 11, 3), (Bandit, 12, 5)]


如果小狗 Bandit 比较兴奋,那它的叫声也会变大,也就是字段 barkingVolume 更新为 6: (Bandit,12,6),这时候 Flow 会重新派发最新数据,所以整个列表被更新为:

[(Frida, 11, 3), (Bandit, 12, 6)]


现在我们来看一下获取单只小狗详细信息的操作,为了能够实时地获取小狗的最新数据,我们返回 Flow:

@Query("SELECT * FROM Dog WHERE name = :name")fun getDog(name: String): Flow<Dog>


如果我们调用 getDog("Frida"),Flow 会返回一个对象: (Frida, 11, 3)。


只要是数据库中的任意一个数据有更新,无论是哪一行数据的更改,那就重新执行 query 操作并再次派发 Flow,因此当小狗 Frida 有更新时我们会收到最新的数据。同样道理,如果一个不相关的数据,比如小狗 Bandit 有更新时我们的 Flow 也会被派发,而且会收到与之前相同的数据: (Frida, 11, 3)。


这是因为 SQLite 数据库的内容更新通知功能是以表 (Table) 数据为单位,而不是以行 (Row) 数据为单位,因此只要是表中的数据有更新,它就触发内容更新通知。Room 不知道表中有更新的数据是哪一个,因此它会重新触发 DAO 中定义的 query 操作。您可以使用 Flow 的操作符,比如 distinctUntilChanged 来确保只有在当您关心的数据有更新时才会收到通知。

@Daoabstract class DoggosDao {    @Query("SELECT * FROM Dog WHERE name = :name")    abstract fun getDog(name: String): Flow<Dog>    fun getDogDistinctUntilChanged(name:String) =              getDog(name).distinctUntilChanged()}

  • distinctUntilChanged
    https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/distinct-until-changed.html


推荐您通过 Flow 进行可观察的读操作,以获取数据库中数据更新的通知!您可以在您的整个应用中使用协程 (Coroutine) 和 Flow,而且还可使用 Jetpack 库中支持的其他协程功能,比如: 生命周期感知型协程范围 (lifecycle-aware coroutine scopes) 、挂起生命周期感知型协程 (suspend lifecycle-aware coroutines),也包括 Flow 转 LiveData 的操作。


  • lifecycle-aware coroutine scopes
    https://developer.android.google.cn/topic/libraries/architecture/coroutines#lifecycle-aware
  • suspend lifecycle-aware coroutines
    https://developer.android.google.cn/topic/libraries/architecture/coroutines#suspend
  • Flow 转 LiveData
    https://developer.android.google.cn/reference/kotlin/androidx/lifecycle/package-summary#aslivedata


查看更多使用 Flow 的案例,可参考我们之前发布的一篇基于 Android 开发者峰会应用的最佳实践的文章。



推荐阅读






 点击屏末  | 查看 Android 官方中文文档 —— 使用 Kotlin 更快地编写更出色的 Android 应用



登录查看更多
1

相关内容

【经典书】C语言傻瓜式入门(第二版),411页pdf
专知会员服务
51+阅读 · 2020年8月16日
【干货书】Python 编程,480页pdf
专知会员服务
229+阅读 · 2020年8月14日
【经典书】算法C语言实现,Algorithms in C. 672页pdf
专知会员服务
80+阅读 · 2020年8月13日
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【干货书】用于概率、统计和机器学习的Python,288页pdf
专知会员服务
281+阅读 · 2020年6月3日
【干货书】机器学习Python实战教程,366页pdf
专知会员服务
332+阅读 · 2020年3月17日
《强化学习—使用 Open AI、TensorFlow和Keras实现》174页pdf
专知会员服务
136+阅读 · 2020年3月1日
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
一文了解强化学习
AI100
15+阅读 · 2018年8月20日
Python | Jupyter导出PDF,自定义脚本告别G安装包
程序人生
7+阅读 · 2018年7月17日
浅显易懂的分布式TensorFlow入门教程
专知
7+阅读 · 2018年6月22日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
自创数据集,用TensorFlow预测股票教程 !(附代码)
教程 | 基于Keras的LSTM多变量时间序列预测
机器之心
20+阅读 · 2017年10月30日
MATLAB人工神经网络教程
七月在线实验室
8+阅读 · 2017年9月6日
python进行数据分析之数据聚合和分组运算
Python技术博文
3+阅读 · 2017年8月21日
Knowledge Flow: Improve Upon Your Teachers
Arxiv
5+阅读 · 2019年4月11日
Arxiv
3+阅读 · 2019年3月1日
Arxiv
3+阅读 · 2018年5月28日
Arxiv
10+阅读 · 2017年12月29日
VIP会员
相关VIP内容
【经典书】C语言傻瓜式入门(第二版),411页pdf
专知会员服务
51+阅读 · 2020年8月16日
【干货书】Python 编程,480页pdf
专知会员服务
229+阅读 · 2020年8月14日
【经典书】算法C语言实现,Algorithms in C. 672页pdf
专知会员服务
80+阅读 · 2020年8月13日
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【干货书】用于概率、统计和机器学习的Python,288页pdf
专知会员服务
281+阅读 · 2020年6月3日
【干货书】机器学习Python实战教程,366页pdf
专知会员服务
332+阅读 · 2020年3月17日
《强化学习—使用 Open AI、TensorFlow和Keras实现》174页pdf
专知会员服务
136+阅读 · 2020年3月1日
相关资讯
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
一文了解强化学习
AI100
15+阅读 · 2018年8月20日
Python | Jupyter导出PDF,自定义脚本告别G安装包
程序人生
7+阅读 · 2018年7月17日
浅显易懂的分布式TensorFlow入门教程
专知
7+阅读 · 2018年6月22日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
自创数据集,用TensorFlow预测股票教程 !(附代码)
教程 | 基于Keras的LSTM多变量时间序列预测
机器之心
20+阅读 · 2017年10月30日
MATLAB人工神经网络教程
七月在线实验室
8+阅读 · 2017年9月6日
python进行数据分析之数据聚合和分组运算
Python技术博文
3+阅读 · 2017年8月21日
Top
微信扫码咨询专知VIP会员