Обертывание MutableList в LiveData или MutableLiveData - PullRequest
0 голосов
/ 22 ноября 2018

Каков рекомендуемый способ упаковки MutableList в LiveData или MutableLiveData, чтобы можно было изменить список и наблюдать за изменениями, которые он претерпевает?

У меня есть довольно короткие таблицы (<20 элементов) в комнате (кэширует значения, полученные с сервера).Я хотел бы сохранить изменяемое подмножество этих элементов;для использования в качестве фильтров в запросах к другим, более крупным таблицам.Я думал о том, чтобы назначить <code>MutableList классу модели в моем приложении и сделать его видимым, обернув этот класс либо в MutableLiveData, либо в LiveData.Затем, обновляя элементы в этих выборках, я мог инициировать необходимые запросы для больших таблиц.

В настоящее время мой код имеет следующую структуру, я сократил его в своем вопросе до того, что я считаю актуальным.В конце концов я хотел бы использовать несколько keyset в более сложных запросах.Файл моей упрощенной модели выглядит следующим образом:

class Model(application : Application) : AndroidViewModel(application)
{
  val keys    : LiveData<List<Key>>
  val keyset  : LiveData<MutableList<Key>>
  val values  : LiveData<List<Value>>
  init {
    keys   = repository.keys
    values = repository.values
    keyset = mutableListOf<Key>() // I'm not entirely sure how to instantiate LiveData<MutableList<Key>>
  }
}

, он опирается на хранилище,

class Repository(private val queryset : QuerySet)
{
   val keys   : LiveData<List<Key>>   = queryset.getKeys()
   val values : LiveData<List<Value>> = queryset.getValues()
}

, который опирается на набор запросов

@Dao
class QuerySet(application : Application) : AndroidViewModel(application)
{
  @Query("SELECT * FROM KeyEntity")
  fun getKeys() : LiveData<list<Key>>
  @Query("SELECT * FROM ValueEntity WHERE key in (:keys)")
  fun getValues(keys : MutableList<Key>) : LiveData<list<Value>>
}

Keyи Value классы являются просто POJO для KeyEntity и ValueEntity и просто указывают те же поля.

Должен ли я использовать MutableLiveData или LiveData для этой цели?Если так, то как реализовать keyset?Возможно, есть более канонический способ сделать это?

1 Ответ

0 голосов
/ 22 ноября 2018

LiveData против MutableLiveData

Я не был уверен, нужно ли мне обернуть мой MutableList в LiveData<MutablList<POJO>> или MutableLiveData<MutableList<POJO>>, где POJO - это экземпляр объекта базы данных иликласс данных, проксирующий один или несколько объектов базы данных. Снех Пандая кратко объясняет разницу между двумя классами.Я также был не уверен, как их создать.Следующее создает экземпляр, но value из keyset инициализируется как null, и необходимо установить начальное значение для MutableLiveData.

class Model(application : Application) : AndroidViewModel(application)
{ ...
  val keyset  : LiveData<MutableList<Key>>
  init { ...
    keyset = MutableLiveData<MutableList<Key>>() // Initialized as null
    keyset.value = mutableListOf<Key>()          // Assign an empty list
  ... }
... }

В MutableLiveData есть нюансне формально инкапсулирует данные.То есть, когда он оборачивает элемент, он не отображает методы обернутых элементов, поскольку он сам отправляет уведомления об изменении обернутого элемента.Он просто отслеживает, когда обернутый предмет был заменен (см. Gznlt ). Samnang CHEA предоставляет хороший метод для поддержки этого.

Location, Location, Location, ...

Я не был уверен, где формально разместить атрибут keyset,Документация Android содержит следующую информацию;как оказалось, я был на правильном пути.

Обновление объектов LiveData

LiveData не имеет общедоступных методов для обновления сохраненных данных.Класс MutableLiveData публично предоставляет методы setValue (T) и postValue (T), и вы должны использовать их, если вам нужно отредактировать значение, хранящееся в объекте LiveData.Обычно MutableLiveData используется в ViewModel, а затем ViewModel предоставляет наблюдателям только неизменные объекты LiveData.

Запросы

Что я еще не разработал, - это как запустить обновлениеvalues.

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