将Room表与RecyclerView同步的最佳模式是什么?

时间:2019-04-06 00:35:59

标签: android database android-recyclerview synchronization android-room

我有:

  • 我的实体obj的表。
  • (模型)类Obj
  • 房间实体ObjEntity
  • 房间DAO,ObjDao
  • 最后是我的模型Obj的RecyclerView。

在我的Obj类中,我添加了一个插入方法-Obj#Post,该方法可以将Obj存储到应用程序的数据库中(句柄转换为ObjEntity,子实体/列​​表等的键)

首先想到的是重新查询所有obj的{​​{1}}表,然后再获取此obj,将其映射到ObjEntity[],然后再更新(所有Obj[]的内存版本-并通知回收者视图适配器更新。


这显然不是最好的方法,因为它只会在插入时更新,而不会删除等。这也不遵循关注点分离的模式。


我理想的情况是让RecyclerView动态查询数据库本身,并相应地进行更新。但是,适配器的实现基于有序列表结构而工作。现在,obj并不总是具有连续的objs-因此,除非我进行了一些时髦的破解,以将id返回的值映射到每个ID,否则似乎不会像它会工作。同样,最重要的是,此解决方案没有通知适配器的更改。通常它只是在进行查询-我不知道实现方式,我猜是某种形式的轮询或用户交互触发。


Room是否具有某种形式的回调API,即RecyclerView.Adapter#getItemCount

1 个答案:

答案 0 :(得分:1)

您需要的是完全在Android体系结构组件中设计的。

只要会议室数据库中发生更改,LiveData就会通知视图。

ViewModel处理独立于UI的数据操作,即完整的CURD操作。

Repository模块处理数据操作。他们提供了一个干净的API,以便应用程序的其余部分可以轻松检索此数据。他们知道从何处获取数据以及更新数据时API会执行什么操作。您可以将存储库视为不同数据源(例如持久性模型,Web服务和缓存)之间的中介。

Android Architecture Component

App using these components

如果您想在recyclerview中使用它进行分页,请使用PagedListAdapter而不是RecyclerView.Adapter