gpt4 book ai didi

kotlin - 如何使用协程从 Room 返回单个(非 LiveData)对象

转载 作者:行者123 更新时间:2023-12-02 13:31:40 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com