在“房间”数据库中,我想添加一些观察者,其通知类似于:删除,插入,更新。
我确实通过创建接口来实现该目的,然后适配器实现了该接口。因此,每次数据库事务之一结束时,都会在适配器上执行匹配操作。
但是我不确定这是否是正确的方法,也许rxjava有某种方法吗?还是RecyclerView中的DiffUtil?
答案 0 :(得分:0)
您应该从Dao方法返回LiveData对象,以观察CRUD操作。
在回购上执行任何CRUD操作时,LiveData将得到更新。
然后,您可以从存储库中获取更新的数据并反映适配器中的更改。
答案 1 :(得分:0)
我建议您使用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()
ViewModel
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可以过滤排放并且仅对不同的对象。
如果可观察查询是使用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