【问题标题】:Room database observer房间数据库观察者
【发布时间】:2019-01-28 19:50:02
【问题描述】:

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

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

但我不确定这是否是正确的方法,也许 rxjava 有一些方法?或者 RecyclerView 中的 DiffUtil?

【问题讨论】:

    标签: java android rx-java2 android-room


    【解决方案1】:

    我建议你使用 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

    【讨论】:

    • 是的,这会在发生任何事情时发送调用,并且没有指定更改的内容
    • 更新答案请看
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的。但如果有任何变化,LiveData 和 Flowable/Observable 都会返回整个数据列表。
    • 正确。要进一步找出原始数据和新数据之间的差异,应该使用 DIffUtil。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2018-04-14
    • 2014-01-28
    相关资源
    最近更新 更多