android - 在带有 Kotlin 协程的 Room DAO 中使用 Deferred<...>

标签 android android-room kotlin-coroutines

我正在尝试在 Android 项目中将协程与 Room 数据库结合使用。我在网上几乎找不到任何文档,我想知道是否可以返回 Deferred<>在这些方法中输入。像这样:

@Dao
interface MyObjectDAO {

@Query("SELECT * FROM myObject WHERE id_myObject = :idMyObject")
suspend fun readMyObjectAsync(idMyObject: Int): Deferred<MyObject>
}

我试过了,我得到了 Not sure how to convert a Cursor to this method's return type在编译时。

我的依赖项是:

kapt 'androidx.room:room-compiler:2.1.0-alpha04'
implementation 'androidx.room:room-runtime:2.1.0-alpha04'
implementation 'androidx.room:room-coroutines:2.1.0-alpha04'

最佳答案

您的问题在于您混合了 suspend ing 转换器和 Deferred转换器。使用其中之一,您的代码将按预期工作。

  • fun readMyObjectAsync(idMyObject: Int): Deferred<MyObject> - 如果您需要与 Java 代码接口(interface)/兼容,这是最佳选择,因为它不需要代码转换即可实际运行。
  • suspend fun readMyObjectAsync(idMyObject: Int): MyObject - 如果您在纯 kotlin 上操作,这将允许通过调用它的上下文更好地控制。

关于android - 在带有 Kotlin 协程的 Room DAO 中使用 Deferred<...>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55925479/

相关文章:

当应用程序处于后台时,Android GCM 通知不会重定向到预期的 Activity

android - 是否可以在 Room @DAO 中编写返回 LiveData 的 "suspend"函数?

android - 如何在android中获取Room数据库的行数?

Android 服务中的 Kotlin 协程

kotlin-coroutines - kotlin 协程 - withContext 与 suspendCoroutine

java - Android与PC Socket连接

android - Debug.startMethodTracing() 跟踪文件的目录

android - AdMob 欧盟同意错误 : consent form can be used with custom provider selection only

android - 在 kotlin 中声明单例

android - 协程 - 带有连接的 Dispatchers.Main.immediate 在 runBlocking 内死锁