我正在尝试使用Kotlin协程通过这里描述的方法访问Room数据库,我已添加插件和依赖项,并在gradle中启用了Kotlin协程。
在gradle文件中:
kotlin {
experimental {
coroutines 'enable'
}
}
dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.21" ...}
所以我为dao类中的所有方法添加了 suspend
关键字,例如:
dao类
@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: 错误: 删除方法必须返回void或返回int(被删除的行数)。
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: 错误: 查询方法参数应该是可以转换为数据库列的类型,或者是一个包含这种类型的List / Array。您可以考虑为此添加类型适配器。
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
关键字,因为代码中有许多地方需要查询数据库。
我该如何解决这个问题?