将LiveData转换为MutableLiveData
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将LiveData转换为MutableLiveData相关的知识,希望对你有一定的参考价值。
显然,Room无法处理MutableLiveData,我们必须坚持使用LiveData,因为它返回以下错误:
error: Not sure how to convert a Cursor to this method's return type
我用这种方式在我的数据库助手中创建了一个“自定义”MutableLiveData:
class ProfileRepository @Inject internal constructor(private val profileDao: ProfileDao): ProfileRepo{
override fun insertProfile(profile: Profile){
profileDao.insertProfile(profile)
}
val mutableLiveData by lazy { MutableProfileLiveData() }
override fun loadMutableProfileLiveData(): MutableLiveData<Profile> = mutableLiveData
inner class MutableProfileLiveData: MutableLiveData<Profile>(){
override fun postValue(value: Profile?) {
value?.let { insertProfile(it) }
super.postValue(value)
}
override fun setValue(value: Profile?) {
value?.let { insertProfile(it) }
super.setValue(value)
}
override fun getValue(): Profile? {
return profileDao.loadProfileLiveData().getValue()
}
}
}
这样,我从DB获取更新并可以保存Profile
对象,但我无法修改属性。
例如:mutableLiveData.value = Profile()
会起作用。 mutableLiveData.value.userName = "name"
将getValue()
称为postValue()
而不会工作。
有没有人为此找到解决方案?
叫我疯了,但AFAIK没有理由将MutableLiveData用于从DAO收到的对象。
这个想法是你可以通过LiveData<List<T>>
暴露一个对象
@Dao
public interface ProfileDao {
@Query("SELECT * FROM PROFILE")
LiveData<List<Profile>> getProfiles();
}
现在你可以观察它们:
profilesLiveData.observe(this, (profiles) -> {
if(profiles == null) return;
// you now have access to profiles, can even save them to the side and stuff
this.profiles = profiles;
});
因此,如果要使此实时数据“发出新数据并对其进行修改”,则需要将配置文件插入数据库。 write将重新评估此查询,并在将新的配置文件值写入db后将其发出。
dao.insert(profile); // this will make LiveData emit again
因此没有理由使用getValue
/ setValue
,只需写入您的数据库。
由于Room不支持MutableLiveData
并且仅支持LiveData
,因此您创建包装器的方法是我能想到的最佳方法。由于Google
和MutableLiveData
方法是setValue
,postValue
支持qazxswpo将是复杂的。在public
,他们是LiveData
,它提供更多的控制。
在您的存储库中,您可以获取protected
并将其转换为LiveData
:
MutableLivedata
以上是关于将LiveData转换为MutableLiveData的主要内容,如果未能解决你的问题,请参考以下文章
未解决的参考:asLiveData 同时将 Flow 转换为 LiveData