【发布时间】:2019-01-28 19:50:02
【问题描述】:
在 Room 数据库中,我想在通知的位置添加一些观察者:删除、插入、更新。
我确实通过创建一个接口来实现这一点,然后适配器实现它。所以每次数据库事务之一结束时,都会在适配器上执行一次匹配操作。
但我不确定这是否是正确的方法,也许 rxjava 有一些方法?或者 RecyclerView 中的 DiffUtil?
【问题讨论】:
标签: java android rx-java2 android-room
在 Room 数据库中,我想在通知的位置添加一些观察者:删除、插入、更新。
我确实通过创建一个接口来实现这一点,然后适配器实现它。所以每次数据库事务之一结束时,都会在适配器上执行一次匹配操作。
但我不确定这是否是正确的方法,也许 rxjava 有一些方法?或者 RecyclerView 中的 DiffUtil?
【问题讨论】:
标签: java android rx-java2 android-room
我建议你使用 Rxjava。
借助依赖项中的android.arch.persistence.room:rxjava2:1.1.1,您可以直接观察数据库中的变化。
Dao.kt
@Query("SELECT * FROM table")
abstract fun getAllData(): Flowable<List<TableData>>
存储库
fun getDataFromDb():Flowable<List<TableData>>= database.dao().getAllData()
视图模型
repository.getDataFromDb()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy{
//Todo here you will receive the data whenever there is any change in database
}
还请注意
Room 只知道表已被修改,但不知道为什么以及发生了什么变化。因此,重新查询后,查询的结果由 LiveData 或 Flowable 发出。由于 Room 没有在内存中保存任何数据并且不能假设对象具有 equals(),它无法判断这是否是相同的数据。您需要确保您的 DAO 过滤排放并且只对不同的对象。
如果 observable 查询是使用 Flowables 实现的,请使用 Flowable#distinctUntilChanged
Flowable<TableData> = repository.getDataFromDb()
.distinctUntilChanged{previous,next-> //here you can check for difference }
您可以点击此链接了解更多详情
https://medium.com/androiddevelopers/7-pro-tips-for-room-fbadea4bfbd1
【讨论】:
您应该从您的 Dao 方法中返回 LiveData 对象以观察 CRUD 操作。
在您的存储库上执行任何 CRUD 操作时,LiveData 将得到更新。
然后您可以从您的存储库中获取更新的数据并在适配器中反映更改。
【讨论】: