协程流:不确定如何将游标转换为此方法的返回类型

40

当我试图将Dao更改为新的Flow API时,我遇到了编译错误,指出

Not sure how to convert a Cursor to this method's return type
    public abstract kotlinx.coroutines.flow.Flow<java.util.List<com.ezek.ezign.model.ECampaign>> readCampaigns();
道即为。
@Dao
interface CampaignDao {

    @Query("SELECT * FROM campaign ORDER BY timeStamp ASC")
    fun readCampaigns(): Flow<List<ECampaign>>

    @Query("SELECT * FROM campaign WHERE id = :campaignId")
    fun readCampaign(campaignId: Int): Flow<ECampaign>
}

并且相关依赖项为

    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'

    implementation "android.arch.persistence.room:runtime:$rootProject.ext.room_version"
    kapt "android.arch.persistence.room:compiler:$rootProject.ext.room_version"

//room_version = "2.1.0"

我已经尝试过使用ListArrayList,但没有成功。

提前致谢。

3个回答

114

不要在同一个方法中同时使用suspend和Flow<>!就像这样

 @Query("SELECT * FROM user")
    suspend fun loadAll(): Flow<Array<User>>

只需要

@Query("SELECT * FROM user")
    suspend fun loadAll(): Array<User>
@Query("SELECT * FROM user")
   fun loadAll(): Flow<Array<User>>

27
不要在同一方法中同时使用suspend和Flow<>。- 这应该是错误信息。 - Scott Cooper
当我们返回Flow时,无需使用suspend关键字。 - Samsad CV
2
@ScottCooper,这是不可能的,这会让我们的生活变得太容易了。 - X09
2
@X09 我们基本上是因为在 Stack Overflow 上搜索问题而得到报酬的。 - Uriel Frankel
上面的答案是正确的,但请考虑将room_version更改为至少2.4.2 - pseudoankit

2
你留下了一个评论,说明你正在使用2.1.0版本的Room。请阅读这篇文章,你会发现需要使用2.2.0-alpha2版本才能使用Flow。更新版本后应该就可以正常工作了。

Room 2.2.0-alpha02支持Flow。


0

我尝试了其他答案中提供的方法,即避免在具有suspend函数的DAO中使用FlowLiveData,但仍然出现错误。

最后,我的问题与我的依赖项有关。我有多个房间依赖项,例如:

    def room_version = "2.2.5"
    implementation "androidx.room:room-runtime:$room_version"
    kapt           "android.arch.persistence.room:compiler:1.1.1"
    implementation "androidx.room:room-ktx:$room_version"

当只需要最后一个时(请参见编辑):

    implementation "androidx.room:room-ktx:2.2.5"

编辑

实际上,这并不是真的。它编译得很好,但当我启动应用程序时,在运行时出现了错误。

通过交换编译器版本,我可以使其正常工作:

    def room_version = "2.2.5"
    implementation "androidx.room:room-runtime:$room_version"
    kapt           "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-ktx:$room_version"

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