我块引用
有单独的类来处理数据获取(使用房间(,我通常从中返回对象的 LiveData 列表并更新它们。现在我有一个设置类,当我按"备份"时,我想将返回的数据存储在 ViewModel 中,但问题是为了获取值,我需要观察对象的 LiveData 列表。我不想观察它,因为我只需要值(对象列表(来执行备份。我尝试了以下方法:
道
@Query("SELECT * FROM $DATABASE_TABLE_GOAL")
suspend fun getAllGoals_NotLive(): List<Goal>
视图模型
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。我该怎么办?
现在,你有一个DAO,它有一个这样的函数:
@Query("...")
fun gimmeData(): LiveData<SomethingOrAnother>
这要求您观察LiveData
才能执行查询。在您的情况下,在某些情况下,您不希望这样做。因此,您需要另一个功能。
一种选择是具有函数的同步版本:
@Query("...")
fun gimmeDataSync(): SomethingOrAnother
现在,您无需观察LiveData
。但是,您需要在后台线程上调用gimmeDataSync()
。
或者,由于您使用的是 Kotlin,因此您可以添加 Room 依赖项以支持协程,并具有:
@Query("...")
suspend fun gimmeDataAsync(): SomethingOrAnother
再一次,您无需观察LiveData
。您需要从协程内部调用gimmeDataAsync()
,例如在ViewModel
上使用viewModelScope
:
viewModelScope.launch(Dispatchers.Main) {
val something = dao.gimmeDataAsync()
// TODO do something with something
}