首页 > 解决方案 > 如何选择性地观察 Android Room 数据库 INSERT、DELETE 和 UPDATE 事件?

问题描述

我用这种方式设计了 DAO。

@Dao
interface FooDao {

    @Query("SELECT * FROM foo")
    LiveData<List<Foo>> stream();
}

以上让我可以同时接收INSERTUPDATEDELETE事件,我无法知道数据是最近插入、删除还是更新。

目标

我的目标是能够快速更新数据库并让 RecyclerView 反映更改而不会卡顿或完全冻结。

现在的情况

我有一个后台服务正在更新数据库并使用上述方法,我正在使用DiffUtil类来计算差异并在前端相应地更新列表。

问题

因为更新来得太快了,RecyclerView 被冻结了。我使用 RxJava 添加了后台处理(DiffUtil 计算)(因为无论如何我都有它),这只是显着减少了口吃,但不是完全。

理想目标

我需要找到一种单独更新列表的方法,或者如果可能的话,跳过只接收UPDATE来自 Room 的事件INSERTDELETE事件,因为这些是手动完成的,所以应该无法冻结 UI。

这样,我可以使用 EventBus 来通知适配器从后台服务更改了一行,而不会触发UPDATE来自 Room 的事件,否则会导致适配器执行 DiffUtil 计算,从而减慢 UI。

INSERT这意味着为、DELETEUPDATE/或仅选择性地观察特定事件隔离数据库事件。

Room 有没有这样的方法,如果有,我该如何实现?

标签: androidandroid-roomrx-androidandroid-architecture-componentsandroid-livedata

解决方案


推荐阅读