1

将 a 包装MutableList在其中一个LiveDataMutableLiveData这样的推荐方法是什么,以便可以修改列表并观察它所经历的变化?

我在 Room 中有一些相当短的表(<20 个项目)(它缓存从服务器检索到的值)。我想保留这些项目的可变子集;用作其他更大表的查询中的过滤器。我的想法是将 a 分配给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>>
}

KeyValue类只是简单的 POJO和KeyEntity简单ValueEntity地指定相同的字段。

我应该使用MutableLiveData还是LiveData为此目的?如果是这样应该如何实施keyset?也许这样做有更规范的方式?

4

1 回答 1

4

LiveData 与 MutableLiveData

我不确定是否必须包装我MutableList的 asLiveData<MutablList<POJO>>或 as MutableLiveData<MutableList<POJO>>POJO数据库实体的实例或代理一个或多个数据库实体的数据类的实例在哪里。Sneh Pandaya简洁地解释了这两个类之间的区别。我也不确定如何实例化它们。以下创建实例,但valueofkeyset被初始化为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提供了一个很好的方法来支持这一点。

地点,地点,地点,...

我不确定在哪里正式放置该keyset属性。Android 文档提供了以下信息;事实证明我走的是正确的道路。

更新 LiveData 对象

LiveData 没有公开可用的方法来更新存储的数据。MutableLiveData 类公开了 setValue(T) 和 postValue(T) 方法,如果您需要编辑存储在 LiveData 对象中的值,则必须使用这些方法。通常在 ViewModel 中使用 MutableLiveData,然后 ViewModel 只向观察者公开不可变的 LiveData 对象。

查询

我还没有解决的是如何触发values.

于 2018-11-22T10:33:04.120 回答