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

Posted

技术标签:

【中文标题】协程流程:不确定如何将游标转换为此方法的返回类型【英文标题】:coroutine Flow : Not sure how to convert a Cursor to this method's return type 【发布时间】:2020-03-28 22:12:04 【问题描述】:

当我尝试将 Dao 更改为新的 FlowApi 时,我收到编译错误,指出

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,但没有运气。

提前致谢。

【问题讨论】:

【参考方案1】:

不要在同一个方法上同时使用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>>

【讨论】:

“不要在同一个方法上同时使用suspend和Flow”——这应该是错误信息 返回Flow时不需要使用suspend关键字 @ScottCooper 那不能做,它会让我们的生活变得太容易。 @X09 我们基本上是通过在 *** 上搜索问题而获得报酬【参考方案2】:

您留下了一条评论说您正在使用 2.1.0 作为房间版本。请阅读this,您会发现使用Flow 需要2.2.0-alpha2。更新版本,它应该可以工作。

Room 2.2.0-alpha02 宣传 Flow 支持

【讨论】:

【参考方案3】:

我尝试了其他答案中提供的方法,即避免 DAO 中的 FlowLiveData 具有 suspend 功能,但我仍然收到错误。

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

    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"

【讨论】:

以上是关于协程流程:不确定如何将游标转换为此方法的返回类型的主要内容,如果未能解决你的问题,请参考以下文章

Android 房间数据库 - 不确定如何将 Cursor 转换为此方法的返回类型

Room:不确定如何将 Cursor 转换为此方法的返回类型

如何在 ROOM android 中修复“不确定如何将光标转换为此方法的返回类型”

Paging3:在 Room DAO 中使用 PagingSource 作为返回类型时,“不确定如何将 Cursor 转换为此方法的返回类型”

Android Room 不确定如何将光标转换为方法的返回类型问题

如何启动并行协程并返回结果