Room 执行返回 LiveData
的查询自动在后台线程上。但我想返回一个未包装到 LiveData
中的值(因为我不想实时更新)。
我如何使用协程来实现这一点?
我如何退回 Task
来自这个函数的对象?
fun getTask(id: Int): Task {
viewModelScope.launch {
repository.getTask(id)
}
}
这个函数在 ViewModel 里面。它将调用转发到 DAO:
@Query("SELECT * FROM task_table WHERE id = :id")
fun getTask(id: Int): Task
最佳答案
如果您不从 Room 返回 LiveData,您将无法从数据库获得更新。但是,您可以从 viewModel 返回 LiveData。
val data = liveData {
emit(repository.getTask(id))
}
liveData
扩展函数在协程中运行,然后您可以使用 DAO 的挂起版本来正确处理后台。@Query("SELECT * FROM task_table WHERE id = :id")
suspend fun getTask(id: Int): Task?
如果您没有在查询中使用聚合函数,您需要做的一件大事是确保它可以为空。
如果您真的想调用 viewModel 中的方法来返回任务,您应该从您的事件/片段运行启动(不推荐)
ViewModel
suspend fun getTask(id: Int): Task {
repository.getTask(id)
}
Activity/Fragment
lifecycleScope.launch {
val task = viewModel.getTask(id)
// Do What you want with the task
}
关于kotlin - 如何使用协程从 Room 返回单个(非 LiveData)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61034666/