我试图通过描述here的方法使用kotlin协同程序访问会议室数据库,添加了插件和依赖项,并在gradle中启用了kotlin协同程序。
gradle 文件中的:
kotlin {
experimental {
coroutines 'enable'
}
}
dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.21" ...}
所以我为dao类中的所有方法添加了suspend
关键字,如下所示:
dao class
@Query("select * from myevent")
suspend fun all(): List<MyEvent>
@Delete
suspend fun deleteEvent(event: MyEvent)
...
并构建,然后获取这些错误
错误
e: C:\Users\projectpath\app\build\tmp\kapt3\stubs\debug\com\robyn\myapp\data\source\local\EventsDao.java:39: error: Deletion methods must either return void or return int (the number of deleted rows).
public abstract java.lang.Object deleteEventById(@org.jetbrains.annotations.NotNull()
^
e: C:\Users\projectpath\app\build\tmp\kapt3\stubs\debug\com\robyn\myapp\data\source\local\EventsDao.java:41: error: Query method parameters should either be a type that can be converted into a database column or a List / Array that contains such type. You can consider adding a Type Adapter for this.
kotlin.coroutines.experimental.Continuation<? super kotlin.Unit> p1);
错误链接导航到自动生成的 dao类。此类中生成的方法现在每个都有一个此类型Continuation
的附加参数,如下所示:
自动生成dao类
@org.jetbrains.annotations.Nullable()
@android.arch.persistence.room.Delete()
public abstract java.lang.Object deleteAllEvents(@org.jetbrains.annotations.NotNull() // error indicates at this line
java.util.List<com.robyn.myapp.data.MyEvent> events, @org.jetbrains.annotations.NotNull()
kotlin.coroutines.experimental.Continuation<? super kotlin.Unit> p1); // error indicates at this line
...
我尝试删除生成的dao类并重建以重新入侵它,仍然会出现这些错误。我认为不使用lauch{}
方法但使用suspend
关键字,因为代码中有很多地方可以查询db。
我该如何解决这个问题?
答案 0 :(得分:10)
您不能将suspend
方法用于DAO。
挂起在编译时处理的函数,编译器更改了此函数的签名(不同的返回类型,状态机回调的附加参数),使其无阻塞。
Room等待特定方法签名生成代码。因此,在Room不直接支持协同程序之前,您不能对DAO使用挂起函数。
目前,您有这样的解决方法:
但是如果可能的话,总是更喜欢选项1,因为Room已经提供了非阻塞API,只需使用协程适配器就可以在没有回调的情况下使用这个API和协同程序
从Room 2.1.0-alpha03
开始,DAO方法现在可以是suspend
个函数。专门注释为@Insert,@ Update或@Delete的Dao方法可以是挂起函数。注释为@Query的插入,更新和删除是not yet supported,尽管是普通查询。有关详细信息,请参阅:Architecture Components Release Notes和Feature Request。
答案 1 :(得分:2)
我通过将房间版本更改为最新的稳定版本(截至撰写本文时为 2.3.0)来解决此问题,同时我当前的 Kotlin 版本为 1.5.10。
通常,如果您仍有错误,我建议您使用最新的稳定版本作为依赖项。
答案 2 :(得分:1)
实际上有可能,
您需要使用:
implementation "androidx.room:room-coroutines:${versions.room}"
您可以遵循本教程:https://medium.com/androiddevelopers/room-coroutines-422b786dc4c5
另外,对我有用的版本是:2.1.0-alpha04 所以,我的房间主管是:
implementation "androidx.room:room-runtime:2.1.0-alpha04"
implementation "androidx.room:room-coroutines:2.1.0-alpha04"
kapt "androidx.room:room-compiler:2.1.0-alpha04"