在带有 Kotlin 协程的 Room DAO 中使用 Deferred<...>
Using Deferred<...> in Room DAO with Kotlin Coroutines
我正在尝试在 Android 项目中将协程与 Room 数据库结合使用。我在网上几乎找不到任何文档,我想知道是否可以在这些方法中输入 return 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>
- 如果您需要 interface/be 与 java 代码兼容,这是最佳选择,因为它不需要代码转换即可实际运行。
suspend fun readMyObjectAsync(idMyObject: Int): MyObject
- 如果您在纯 kotlin 上操作,这将允许通过调用它的上下文更好地控制。
我正在尝试在 Android 项目中将协程与 Room 数据库结合使用。我在网上几乎找不到任何文档,我想知道是否可以在这些方法中输入 return 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>
- 如果您需要 interface/be 与 java 代码兼容,这是最佳选择,因为它不需要代码转换即可实际运行。suspend fun readMyObjectAsync(idMyObject: Int): MyObject
- 如果您在纯 kotlin 上操作,这将允许通过调用它的上下文更好地控制。