Car*_*rel 2 kotlin android-livedata mutablelivedata mutablelist
MutableList
将 a 包装在LiveData
or中的建议方法是什么MutableLiveData
,以便可以修改列表并观察它所发生的变化?
我在 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>>
}
}
Run Code Online (Sandbox Code Playgroud)
它依赖于存储库,
class Repository(private val queryset : QuerySet)
{
val keys : LiveData<List<Key>> = queryset.getKeys()
val values : LiveData<List<Value>> = queryset.getValues()
}
Run Code Online (Sandbox Code Playgroud)
这依赖于查询集
@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>>
}
Run Code Online (Sandbox Code Playgroud)
和类只是 和 的 POJO Key
,并且只是指定相同的字段。Value
KeyEntity
ValueEntity
我应该使用MutableLiveData
或LiveData
用于此目的吗?如果是这样应该如何实施keyset
?也许有更规范的方式来这样做?
我不确定是否必须将MutableList
asLiveData<MutablList<POJO>>
或 as包装起来MutableLiveData<MutableList<POJO>>
,其中POJO
是数据库实体或代理一个或多个数据库实体的数据类的实例。Sneh Pandaya简洁地解释了这两个类之间的区别。我也不确定如何实例化它们。下面创建了实例,但value
ofkeyset
被初始化为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
... }
... }
Run Code Online (Sandbox Code Playgroud)
有一个细微差别MutableLiveData
,它没有正式封装数据。也就是说,当它包装项目时,它不会公开包装项目的方法,因为当包装项目被修改时,它自己会发出通知。它仅跟踪包装的物品何时被换出(参见 Gznlt)。Samnang CHEA提供了一个很好的方法来支持这一点。
我不确定该keyset
属性应该正式放置在哪里。Android 文档提供以下信息;事实证明我走在正确的道路上。
更新 LiveData 对象
LiveData 没有公开可用的方法来更新存储的数据。MutableLiveData 类公开公开 setValue(T) 和 postValue(T) 方法,如果需要编辑存储在 LiveData 对象中的值,则必须使用这些方法。通常,MutableLiveData 用在 ViewModel 中,然后 ViewModel 只向观察者公开不可变的 LiveData 对象。
我还没有弄清楚如何触发values
.
归档时间: |
|
查看次数: |
11023 次 |
最近记录: |