为了账号安全,请及时绑定邮箱和手机立即绑定

房间数据库观察者

房间数据库观察者

繁星淼淼 2022-05-25 17:13:51
在 Room 数据库中,我想在通知的位置添加一些观察者:删除、插入、更新。我确实通过创建一个接口来实现这一点,然后适配器实现它。因此,每次数据库事务之一结束时,都会在适配器上执行匹配操作。但我不确定这是否是正确的方法,也许 rxjava 有一些方法?或者可能是 RecyclerView 中的 DiffUtil?
查看完整描述

2 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

我建议你使用 Rxjava。


在您的依赖项的帮助下android.arch.persistence.room:rxjava2:1.1.1,您可以直接观察数据库中的变化。


道.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


查看完整回答
反对 回复 2022-05-25
?
慕慕森

TA贡献1856条经验 获得超17个赞

你应该从你的 Dao 方法中返回 LiveData 对象来观察 CRUD 操作。

对您的存储库执行任何 CRUD 操作时,LiveData 将得到更新。

然后您可以从您的存储库中获取更新的数据并反映适配器中的更改。


查看完整回答
反对 回复 2022-05-25
  • 2 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信