△ Room 中对 Flow 的支持html
Jetpack Room 对协程的支持愈来愈丰富: Room 2.1 版本增长了对协程的支持,并加入了一次性 (one-shot) 的读写操做,Room 2.2 咱们经过 Flow 为读操做加入了可观察性,当数据库中的数据有变化时它能够使您收到通知。android
△ Room 支持异步 query 操做git
假设咱们有一个记录小狗信息的数据库,它的 name 字段是主键 (primary key),因此在数据库中不可能同时有两个 name 字段相同的数据,也就是每只小狗都是惟一的。github
@Entity data class Dog ( @PrimaryKey val name: String, val cuteness: Int, val barkingVolume: Int )
为了从数据中获取一个包含全部小狗信息的总表,咱们在 [DAO](https://developer.android.goo...
) 中编写以下 query 语句:数据库
@Query("SELECT * FROM Dog") fun getAllDogs(): List<Dog>
由于小狗的叫声,也就是字段 barkingVolume 会随着时间变化,而且咱们想确保 UI 展现的内容是最新的。所以咱们但愿,当数据库中的数据有变化时,能够通知到咱们: 好比新增,删除,或者是更新了数据。异步
为了实现这个功能,咱们经过更新 query 操做返回一个 Flow 对象。google
@Query("SELECT * FROM Dog") fun getAllDogs(): Flow<List<Dog>>
就像这样,每当数据库中的数据有更新时,会从新派发存有小狗信息的总表。例如,假设咱们的数据库中存有以下数据:spa
(Frida, 11, 3) (Bandit, 12, 5)
第一次调用 getAllDogs 时 Flow 派发的数据以下:code
[(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 来确保只有在当您关心的数据有更新时才会收到通知。
@Dao abstract class DoggosDao { @Query("SELECT * FROM Dog WHERE name = :name") abstract fun getDog(name: String): Flow<Dog> fun getDogDistinctUntilChanged(name:String) = getDog(name).distinctUntilChanged() }
推荐您经过 Flow 进行可观察的读操做,以获取数据库中数据更新的通知!您能够在您的整个应用中使用协程 (Coroutine) 和 Flow,并且还可以使用 Jetpack 库中支持的其余协程功能,好比: 生命周期感知型协程范围 (lifecycle-aware coroutine scopes) 、挂起生命周期感知型协程 (suspend lifecycle-aware coroutines),也包括 Flow 转 LiveData 的操做。
查看更多使用 Flow 的案例,可参考咱们以前发布的一篇基于 Android 开发者峰会应用的最佳实践 的文章。