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

时间:2019-12-04 06:51:43

标签: android kotlin android-room kotlin-coroutines

当我尝试将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 个答案:

答案 0 :(得分:30)

请勿在同一方法上同时使用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>>

答案 1 :(得分:0)

您留下的评论是您使用2.1.0作为会议室版本。请阅读this,您会发现使用2.2.0-alpha2需要Flow。更新版本,它应该可以工作。

  

2.2.0-alpha02房间广告的流量支持

答案 2 :(得分:0)

我尝试了其他答案中提供的方法,即避免在Flow中使用具有LiveData功能的DAOsuspend,但是仍然出现错误。

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

    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"