Blockquote
我有单独的类,在其中我处理数据提取(使用房间),并且通常从中返回LiveData对象列表并更新它们。现在,我有了一个设置类,当我按“备份”时,我想将返回的数据存储在ViewModel中,但是问题是,为了获取该值,我需要观察对象的LiveData列表。我不想观察它,因为我只需要值(对象列表)来执行备份。 我尝试了以下方法:
DAO
@Query("SELECT * FROM $DATABASE_TABLE_GOAL")
suspend fun getAllGoals_NotLive(): List<Goal>
ViewModel
var goals_NotLive: List<Goal> = ArrayList()
fun getGoalsNotLive(){
_uiScope.launch {
withContext(Dispatchers.IO) {
goals_NotLive = database.goalDao.getAllGoals_NotLive()
}
}
}
活动
fun getGoals(): List<Goal>{
_viewModel.getGoalsNotLive()
return _viewModel.goals_NotLive
}
但是它仍然返回大小0。我该怎么办?
答案 0 :(得分:2)
现在,您有一个具有以下功能的DAO:
@Query("...")
fun gimmeData(): LiveData<SomethingOrAnother>
这要求您遵守LiveData
才能执行查询。就您而言,在某些情况下您不希望这样做。因此,您需要另一个功能。
一个选择是拥有该功能的同步版本:
@Query("...")
fun gimmeDataSync(): SomethingOrAnother
现在,您无需遵守LiveData
。不过,您将需要在后台线程上调用gimmeDataSync()
。
或者,由于您使用的是Kotlin,因此您可以添加Room依赖以获取协程支持,并具有:
@Query("...")
suspend fun gimmeDataAsync(): SomethingOrAnother
再次,您不需要遵守LiveData
。您需要从协程内部调用gimmeDataAsync()
,例如在viewModelScope
上使用ViewModel
:
viewModelScope.launch(Dispatchers.Main) {
val something = dao.gimmeDataAsync()
// TODO do something with something
}