Kotlin 更新到 1.6.0 后,不确定如何将 Cursor 转换为此方法的返回类型

hid*_*s02 5 android kotlin android-room kotlin-coroutines

我在项目中使用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
}
Run Code Online (Sandbox Code Playgroud)

将 Kotlin 更新到版本 1.6.0 后,我的代码无法再编译,并且收到此错误:

错误:不确定如何将 Cursor 转换为此方法的返回类型 (java.lang.Object)。公共抽象 java.lang.Object getLeastLoadedServer(@org.jetbrains.annotations.NotNull()

经过一番搜索,我发现这是因为挂起函数,所以我从我的 DAO 中删除了挂起关键字,然后我开始收到明显的错误:

java.lang.IllegalStateException:无法在主线程上访问数据库,因为它可能会长时间锁定 UI。

即使我是从 IO 协程调用这些函数。

我还阅读了 Kotlin 1.6.0 的变更日志,但没有多大帮助。

如有任何帮助,我们将不胜感激,谢谢。

hid*_*s02 15

使用 Android Room 2.4.0将解决该问题。

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