У меня есть:
obj
.Obj
.ObjEntity
.ObjDao
.Obj
.В моем классе Obj
я добавил метод вставки — Obj#Post
, который обрабатывает сохранение этого Obj
в базе данных приложения (обрабатывает преобразование в ObjEntity
, внешние ключи для дочерних сущностей/списков и т. д.)
Первая мысль состоит в том, чтобы запросить таблицу obj
для всех obj
, прежде чем взять эту ObjEntity[]
, сопоставить ее с Obj[]
перед обновлением (кэшированной) в памяти версии всех obj
и уведомить адаптер представления ресайклера об обновлении.
Очевидно, что это не лучший подход, так как он будет обновляться только при вставке, а не при удалении и т. д. Это также не соответствует шаблону разделения задач.
В идеале я хочу, чтобы RecyclerView динамически запрашивал базу данных сам и соответственно обновлял ее. Однако реализация адаптера работает на основе структуры упорядоченного списка. Теперь у objs
не всегда будут хорошо смежные id
s - поэтому, если я не применил какой-нибудь забавный хак для сопоставления значения, возвращаемого RecyclerView.Adapter#getItemCount
, с каждым идентификатором, это не похоже, что это сработает. Также, что наиболее важно, в этом решении нет уведомления об изменениях в адаптере. Это будет просто запрос всякий раз, когда он обычно это делает - я не знаю реализацию, я предполагаю, что это какая-то форма опроса или триггер взаимодействия с пользователем.
Есть ли у Room какая-либо форма API обратного вызова, например ObjDao#onTableUpdated
?
То, что вам нужно, точно разработано в компоненте архитектуры Android.
LiveData
уведомляет вид всякий раз, когда в базе данных комнат происходят изменения.
ViewModel
обрабатывает операцию данных независимо от пользовательского интерфейса, то есть завершает операцию CURD.
Модули Repository
обрабатывают операции с данными. Они предоставляют чистый API, чтобы остальная часть приложения могла легко получать эти данные. Они знают, откуда брать данные и какие вызовы API делать при обновлении данных. Репозитории можно рассматривать как посредников между различными источниками данных, такими как постоянные модели, веб-службы и кэши.
Приложение, использующее эти компоненты
Если вы хотите использовать его для разбиения на страницы в recyclerview
, используйте PagedListAdapter
вместо RecyclerView.Adapter