房间"不确定如何将光标转换为此方法的返回类型":哪种方法?

Dav*_*ini 30 android dao kapt android-room android-architecture-components

Error:Not sure how to convert a Cursor to this method's return type
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
Compilation failed; see the compiler error output for details.
Run Code Online (Sandbox Code Playgroud)

使用Room我收到此错误,我想找出导致它的方法.

我有多个DAOs,总共有大约60个方法,并且在添加方法之后弹出了这个错误(从另一个完美工作的复制和粘贴,只是将字段更改为设置).

我可以发布整个类的DAOs,但我想知道哪种方法失败了.我试着用Run with --stacktrace,Run with --info--debug option,但这些都不显示出任何有价值的信息.

我添加的方法是一个@Query UPDATEInt返回类型,如在建议的文档

UPDATE或DELETE查询可以返回void或int.如果是int,则该值是受此查询影响的行数.

编辑:我想补充一点,我尝试删除该方法,使DAO回到工作状态,但它仍然给我这个错误.

EDIT2:添加gradle控制台输出,因为在评论中不可读:

error: Not sure how to convert a Cursor to this method's return type
error: Not sure how to convert a Cursor to this method's return type
2 errors

:app:compileDebugJavaWithJavac FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

BUILD FAILED in 22s
Run Code Online (Sandbox Code Playgroud)

gMa*_*ale 38

对于登陆这里的任何人,使用协程 Flow作为返回类型,如果您不小心使函数挂起,您将收到此错误。由于它正在返回一个流,因此不需要暂停。

所以而不是这个:

@Query("SELECT * FROM myTable WHERE id = :id")
suspend fun findById(id: Long): Flow<MyDataType>
Run Code Online (Sandbox Code Playgroud)

使用这个(没有挂起修饰符):

@Query("SELECT * FROM myTable WHERE id = :id")
fun findById(id: Long): Flow<MyDataType> 
Run Code Online (Sandbox Code Playgroud)

  • 你救了我的命! (6认同)

Ali*_*azi 33

是的,根据您在评论中提到的内容,您不能将返回类型更改List为其中的任何其他内容Dao.我假设Room不知道如何处理其他类型的返回.取出List并将其转换/转换为您想要的类型Dao.


aks*_*nge 15

我整天都在这个问题上。解决方案非常简单。我以前用过这样的东西

@Query("SELECT * FROM myTable")
fun getAll(): MutableLiveData<ArrayList<myData>>
Run Code Online (Sandbox Code Playgroud)

现在,当我将ArrayList更改为List并将MutableLiveData更改为LiveData时,它可以正常工作。

@Query("SELECT * FROM myTable")
fun getAll(): LiveData<List<myData>>
Run Code Online (Sandbox Code Playgroud)

根据对这个问题的答案和评论,我认为会议室仅支持List&LiveData,因为我也尝试了MutableLiveData和仅ArrayList。没有一种组合有效。

希望这对某人有帮助。

  • 就我而言,我使用的是暂停。 (29认同)
  • 如果您使用带有暂停功能的 LiveData 或 Flow,您将收到相同的错误 (9认同)

Mar*_*ouh 15

有一个与 Kotlin@Metadata注释和 Room 读取方式的更改相关的问题,即使用不支持读取信息Room 2.4.2的旧版本库,而在google 中更新了库。kotlinx-metadata-jvmKotlin 1.7.xRoom 2.5.0

要解决此问题,请通过将依赖项添加到注释处理器路径来强制升级依赖项,即kapt "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0"如果您使用的是Room 2.4.x.

或者你可以使用Room 2.5.0-alpha02它来解决问题。

结论

如果你只是想解决错误,请将其添加到 app/gradle 文件中

kapt "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.5.0"
Run Code Online (Sandbox Code Playgroud)

或使用这些版本的房间Kotlin 1.7.x

implementation 'androidx.room:room-ktx:2.5.0-alpha02'
kapt 'androidx.room:room-compiler:2.5.0-alpha02'
Run Code Online (Sandbox Code Playgroud)

来源

更新

现在您可以毫无问题地将 Room 版本更新为Room 2.4.3with 。Kotlin 1.7.10


che*_*han 12

我更新到最新版本 Room - room_version = "2.4.0" 后它就消失了


Dan*_*mes 11

最近,我遇到了同样的问题,但是我CoroutinesDao函数中使用了这样的东西:

@Query("SELECT * FROM Dummy")
suspend fun get: LiveData<List<Dummy>>
Run Code Online (Sandbox Code Playgroud)

并且无法编译,但是删除suspend所有内容后一切正常。

  • 对于“协同例程”支持,我添加了“实现“androidx.room:room-coroutines:${versions.room}””依赖项,但构建失败,提示 **`错误:无法解析:androidx.room:room-协程:2.2.1'**。 (3认同)
  • 这是我的问题。返回 LiveData 时,不应使用挂起函数,因为它们不兼容(并且不需要)。 (2认同)
  • 仅供参考,自 [版本 2.1.0-alpha05](https://developer.android.com/jetpack/androidx/releases/room#2.1.0-alpha05) 起,“room-coroutines”已重命名为“room-ktx” 。但是,我的项目中已经有这个,但它没有修复错误。按照这个答案删除“挂起”确实为我解决了错误。 (2认同)

Fel*_*nco 8

@Query("select * from movie_action")
    suspend fun getMovieActionRoom() : LiveData<List<MoviesActionModel>>
Run Code Online (Sandbox Code Playgroud)

只需删除挂起,在某些情况下错误就会消失。


小智 6

在我的情况下,当我LiveData<ArrayList<Example Class>>在 Dao 类中使用从 Room 获取所有东西时,我遇到了这个问题, 当我更改ArrayListList.

示例(科特林):

@Dao
interface ExampleDao {
@Query("SELECT * from example_table")
fun getAllExample():LiveData<List<Example>>
}
Run Code Online (Sandbox Code Playgroud)