【问题标题】:Using Deferred<...> in Room DAO with Kotlin Coroutines在带有 Kotlin 协程的 Room DAO 中使用 Deferred<...>
【发布时间】:2019-04-30 16:48:15
【问题描述】:

我正在尝试在 Android 项目中将协程与 Room 数据库一起使用。我在网上几乎找不到任何文档,我想知道是否可以在这些方法中返回 Deferred&lt;&gt; 类型。像这样的:

@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'

【问题讨论】:

    标签: android android-room kotlin-coroutines


    【解决方案1】:

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

    • fun readMyObjectAsync(idMyObject: Int): Deferred&lt;MyObject&gt; - 如果您需要与 java 代码接口/兼容,最好的选择,因为它不需要代码转换来实际运行。
    • suspend fun readMyObjectAsync(idMyObject: Int): MyObject - 如果您在纯 kotlin 上运行,这将允许通过调用它的上下文进行更好的控制。

    【讨论】:

    • 很高兴知道,谢谢。我读到如果我用suspend 标记我的DAO 方法,“默认情况下,Room 将使用架构组件I/O 执行器作为调度程序来运行SQL 语句”。 link 如果我选择放弃 'suspend' 关键字并只返回 Deferred,它会做同样的事情吗?
    • 花了一个小时试图解决这个问题。感谢您帮助我发现错误。
    猜你喜欢
    • 2018-07-19
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2019-11-28
    • 2018-05-18
    • 1970-01-01
    相关资源
    最近更新 更多