Как лучше всего синхронизировать таблицу комнат с RecyclerView? - PullRequest
0 голосов
/ 06 апреля 2019

у меня есть:

  • таблица для моей сущности, obj.
  • класс (модель), Obj.
  • a Room Entity, ObjEntity.
  • а Комната DAO, ObjDao.
  • и, наконец, RecyclerView для моей модели, Obj.

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

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


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


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


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

1 Ответ

1 голос
/ 06 апреля 2019

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

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

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

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

Android Architecture Component

Приложение с использованием этих компонентов

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...