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

标签 kotlin android-room android-livedata android-architecture-components kotlin-coroutines

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/

相关文章:

Android架构组件房间库——如何处理来自DAO的livedata

Android:如何在不观察的情况下从 LiveData 获取值(value)

constructor - 辅助 kotlin 构造函数变量是如何传入的?

java - Room Android 实体和 POJO 必须具有可用的公共(public)构造函数

unit-testing - 当使用返回流的存储库对 View 模型进行单元测试时,将其转换为实时数据时会发生错误

java - MutableLiveData 设置值但 getValue() 返回 null?

android - 如何正确调用上下文来启动 Activity

android - kotlin.TypeCastException : null cannot be cast to non-null type android. support.v7.widget.Toolbar

android - SyncAdapter中的Singleton Room数据库触发LiveData

android - 在android中将房间数据库导出到csv文件