不确定如何将一个Cursor转换为此方法的返回类型,这是在Kotlin升级到1.6.0后的问题。

5

我在我的项目中使用Android Room库来操作SQLite数据库中的数据,之前在Kotlin版本(1.5.31)中一切运作正常。这里是我的DAO的示例代码:

@Dao
interface ServersDao {

    @Query("SELECT * FROM servers ORDER BY connectedDevices, ping ASC LIMIT 1")
    suspend fun getLeastLoadedServer(): Server

    @Query("SELECT * FROM servers ORDER BY ping, connectedDevices ASC LIMIT 1")
    suspend fun getNearestServer(): Server
}

更新 Kotlin 至版本 1.6.0 后,我的代码无法编译,并收到以下错误提示:

错误: 不知道如何将一个 Cursor 转换为此方法的返回类型 (java.lang.Object)。 public abstract java.lang.Object getLeastLoadedServer(@org.jetbrains.annotations.NotNull()

经过一些搜索,我发现原因是由于挂起函数。因此,我从 DAO 中删除了 suspend 关键字后,便出现了明显的错误:

java.lang.IllegalStateException: 自主线程上不能访问数据库,因为它可能锁定 UI 较长时间。

即使我是从 IO 协同程序中调用这些函数也不行。
我还查阅了 Kotlin 1.6.0 的变更日志,但没有什么帮助。
如果有任何帮助,感激不尽。谢谢。

你使用M1 CPU吗?Kotlin 1.6.21与Room 2.2.4在我的x86上运行良好,但是我同事的M1上相同的组合不起作用,并抛出这些错误。 - Andrzej Zabost
不,我是x86。请查看下面的答案。 - hiddeneyes02
我看到了答案,但我不明白为什么它在Kotlin 1.6.21和Room 2.2.4中对我有效。有任何想法吗? - Andrzej Zabost
1个回答

14

使用 Android Room 2.4.0 可以解决这个问题。

对于 Kotlin 1.7.10,您需要使用 Room 2.5.0-alpha02 或更新版本。


这拯救了我的生命。非常感谢你。 - Jim
对我来说不起作用!! - undefined
@Malo 你正在使用哪个版本的Kotlin? - undefined
ext.kotlin_version = "1.6.0" - undefined
@Melo 考虑使用较旧版本的Android Room。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接