会议室数据库观察员

时间:2019-01-28 19:50:02

标签: java android rx-java2 android-room

在“房间”数据库中,我想添加一些观察者,其通知类似于:删除,插入,更新。

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

但是我不确定这是否是正确的方法,也许rxjava有某种方法吗?还是RecyclerView中的DiffUtil?

2 个答案:

答案 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