关于android:实战-在-Room-中使用-Flow

4次阅读

共计 1815 个字符,预计需要花费 5 分钟才能阅读完成。

△ Room 中对 Flow 的反对

Jetpack Room 对协程的反对越来越丰盛: Room 2.1 版本减少了对协程的反对,并退出了一次性 (one-shot) 的读写操作,Room 2.2 咱们通过 Flow 为读操作退出了可察看性,当数据库中的数据有变动时它能够使您收到告诉。

△ Room 反对异步 query 操作

Flow 实战

假如咱们有一个记录小狗信息的数据库,它的 name 字段是主键 (primary key),所以在数据库中不可能同时有两个 name 字段雷同的数据,也就是每只小狗都是惟一的。

@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 对象。

@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 来确保只有在当您关怀的数据有更新时才会收到告诉。

@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 开发者峰会利用的最佳实际 的文章。

正文完
 0