房间数据库观察者

Ahm*_*out 0 java android rx-java2 android-room

在 Room 数据库中,我想添加一些观察者,其中的通知如下:删除、插入、更新。

我确实通过创建一个接口来实现这一点,然后适配器实现它。因此,每次一个数据库事务结束时,都会在适配器上执行一次匹配操作。

但我不确定这是否是正确的方法,也许 rxjava 有某种方法可以做到这一点?或者也许是 RecyclerView 中的 DiffUtil?

Raj*_*eck 5

我建议你使用Rxjava。

\n\n

借助android.arch.persistence.room:rxjava2:1.1.1依赖项,您可以直接观察数据库中的更改。

\n\n

道.kt

\n\n
  @Query("SELECT * FROM table")\n    abstract fun getAllData(): Flowable<List<TableData>>\n
Run Code Online (Sandbox Code Playgroud)\n\n

存储库

\n\n
fun getDataFromDb():Flowable<List<TableData>>= database.dao().getAllData()\n
Run Code Online (Sandbox Code Playgroud)\n\n

视图模型

\n\n
repository.getDataFromDb()\n.subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribeBy{\n                        //Todo here you will receive the data whenever there is any change in database\n                     }\n
Run Code Online (Sandbox Code Playgroud)\n\n

还有需要注意的地方

\n\n

Room 只知道表已被修改,但不知道原因和更改内容。因此,重新查询后,查询结果由LiveData或Flowable发出。由于 Room 不会在内存中保存任何数据,并且可以假设对象具有 equals(),因此它可以判断这是否是相同的数据。您需要确保您的 DAO 过滤排放并且仅对不同的对象做出反应。

\n\n

如果可观察查询是使用 Flowables 实现的,请使用 Flowable#distinctUntilChanged

\n\n
   Flowable<TableData> = repository.getDataFromDb()\n                          .distinctUntilChanged{previous,next-> //here you can check for difference }\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以点击此链接了解更多详细信息

\n\n

https://medium.com/androiddevelopers/7-pro-tips-for-room-fbadea4bfbd1

\n