Какой лучший шаблон для синхронизации таблицы Room с RecyclerView?

У меня есть:

  • стол для моей сущности, obj.
  • (образцовый) класс, Obj.
  • Объект комнаты, ObjEntity.
  • Комната ДАО, ObjDao.
  • и, наконец, RecyclerView для моей модели, Obj.

В моем классе Obj я добавил метод вставки — Obj#Post, который обрабатывает сохранение этого Obj в базе данных приложения (обрабатывает преобразование в ObjEntity, внешние ключи для дочерних сущностей/списков и т. д.)

Первая мысль состоит в том, чтобы запросить таблицу obj для всех obj, прежде чем взять эту ObjEntity[], сопоставить ее с Obj[] перед обновлением (кэшированной) в памяти версии всех obj и уведомить адаптер представления ресайклера об обновлении.


Очевидно, что это не лучший подход, так как он будет обновляться только при вставке, а не при удалении и т. д. Это также не соответствует шаблону разделения задач.


В идеале я хочу, чтобы RecyclerView динамически запрашивал базу данных сам и соответственно обновлял ее. Однако реализация адаптера работает на основе структуры упорядоченного списка. Теперь у objs не всегда будут хорошо смежные ids - поэтому, если я не применил какой-нибудь забавный хак для сопоставления значения, возвращаемого RecyclerView.Adapter#getItemCount, с каждым идентификатором, это не похоже, что это сработает. Также, что наиболее важно, в этом решении нет уведомления об изменениях в адаптере. Это будет просто запрос всякий раз, когда он обычно это делает - я не знаю реализацию, я предполагаю, что это какая-то форма опроса или триггер взаимодействия с пользователем.


Есть ли у Room какая-либо форма API обратного вызова, например ObjDao#onTableUpdated?

0
0
186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вам нужно, точно разработано в компоненте архитектуры Android.

LiveData уведомляет вид всякий раз, когда в базе данных комнат происходят изменения.

ViewModel обрабатывает операцию данных независимо от пользовательского интерфейса, то есть завершает операцию CURD.

Модули Repository обрабатывают операции с данными. Они предоставляют чистый API, чтобы остальная часть приложения могла легко получать эти данные. Они знают, откуда брать данные и какие вызовы API делать при обновлении данных. Репозитории можно рассматривать как посредников между различными источниками данных, такими как постоянные модели, веб-службы и кэши.

Android Architecture Component

Приложение, использующее эти компоненты

Если вы хотите использовать его для разбиения на страницы в recyclerview, используйте PagedListAdapter вместо RecyclerView.Adapter

Другие вопросы по теме