86
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.

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

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

我可以发布整个类的DAOs,但我要求一种方法来知道哪个方法失败了。我尝试了Run with --stacktrace,Run with --info--debug option,但这些都没有显示任何有价值的信息。

我添加的方法是@Query UPDATE带有Int返回类型的,如文档中所建议的那样

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
4

24 回答 24

120

最近我遇到了同样的问题,但我CoroutinesDao函数中使用,例如:

@Query("SELECT * FROM Dummy")
suspend fun get(): LiveData<List<Dummy>>

并且无法编译,但是在删除suspend所有内容后一切正常。返回时不需要LiveDatasuspend并且LiveData似乎没有一起工作(截至目前)。

于 2019-09-05T13:15:31.003 回答
72

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

@Query("SELECT * FROM myTable")
fun getAll(): MutableLiveData<ArrayList<myData>>

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

@Query("SELECT * FROM myTable")
fun getAll(): LiveData<List<myData>>

根据对这个问题的回答和评论,我认为房间只支持 List 和 LiveData,因为我也尝试过使用 MutableLiveData 和只支持 ArrayList。没有一种组合奏效。

希望这会帮助某人几个小时。

于 2019-04-21T06:23:32.010 回答
44

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

所以代替这个:

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

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

@Query("SELECT * FROM myTable WHERE id = :id")
fun findById(id: Long): Flow<MyDataType> 
于 2019-11-22T16:59:13.930 回答
37

是的,根据您在评论中提到的内容,您不允许将返回类型从更改ListDao. 我假设 Room 不知道如何处理其他返回类型。在. List_Dao

于 2017-10-24T08:38:52.293 回答
6

就我而言,当我 LiveData<ArrayList<Example Class>>在 Dao 类中用于从 Room 获取所有东西时,我遇到了这个问题,当我更改ArrayListList.

示例(科特林):

@Dao
interface ExampleDao {
@Query("SELECT * from example_table")
fun getAllExample():LiveData<List<Example>>
}
于 2018-12-20T19:44:18.490 回答
6

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

于 2022-01-11T10:14:43.233 回答
5
@Query("select * from movie_action")
    suspend fun getMovieActionRoom() : LiveData<List<MoviesActionModel>>

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

于 2020-11-15T04:50:54.437 回答
2

对我来说,这是因为将 AndroidX 与 Pre-AndroidX 混合在一起。完全迁移并执行此操作后,一切恢复正常。(当然我也搬到了AndroidX-Room)

于 2019-02-24T10:04:47.643 回答
2

我的应用程序有不同的用例。

所以,我试图返回实际Cursor类型。

例如:

@Query("SELECT * FROM tbl_favourite")
abstract suspend fun selectAll(): Cursor

上面的代码总是会抛出Error:Not sure how to convert a android.database.Cursor to this method's return type

但我没记错,官方文档也在这里声明Room支持Cursor.

在尝试调试错误日志并打开MyTableDao_Impl.java文件后,我发现该文件看起来Cursorsuspend关键字的关系不正常。

因此,我已将我的代码更正为:

@Query("SELECT * FROM tbl_favourite")
abstract fun selectAll(): Cursor

瞧,它有效。

于 2019-11-09T17:00:22.590 回答
2

在我的情况下,我使用androidx了依赖项Roomandroid.arch.[旧] 依赖项ViewModelLiveData所以我收到了这条消息

解决方案: 要么使用所有androidx依赖项,要么使用所有旧依赖项andrio.arch

于 2020-02-26T09:28:18.537 回答
2

如果有人在使用和使用andMutableLiveData<List<T>>时确实需要在他们的 ViewModel中,这就是我解决它的方法RoomKotlincoroutines

在Dao中 我得到suspend
MutableListDispatchers.IOsuspend
postValue

视图模型

    private val allItems = MutableLiveData<List<DocumentItem>>()
    init {
        viewModelScope.launch {
            allItems.postValue(repository.getAll())
        }
    }

存储库

    suspend fun getAll(): MutableList<DocumentItem> = withContext(Dispatchers.IO) {
        dao.getAll()
    }

    @Query("SELECT * FROM document_items ORDER BY id DESC")
    suspend fun getAll(): MutableList<DocumentItem>
于 2020-04-22T10:15:15.650 回答
1

就我而言,在得到“不确定如何将游标转换为此方法的返回类型”之后:

删除“构建”并重新构建,错误消失。

于 2018-05-07T03:49:07.967 回答
1

在 build.gradle 的 defaultConfig 中添加以下代码

javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true
于 2018-06-02T06:28:05.090 回答
1

对我来说,我使用错误的返回类型进行查询。

于 2019-03-22T09:58:30.637 回答
1

确保您没有将挂起与 LiveData 一起用作返回类型:

@Query("SELECT * FROM ...")
fun getAllTellsByReceiver(receiverUid: String): LiveData<List<Tell>>
于 2019-11-15T09:21:52.080 回答
0
 class IdAndFullName {
     public int uid;
     @ColumnInfo(name = "full_name")
     public String fullName;
 }
 // DAO
 @Query("SELECT uid, name || lastName as full_name FROM user")
 public IdAndFullName[] loadFullNames();

如果查询结果和 POJO 不匹配,Room 会给你这个错误信息。

或者,如果您使用 @SkipQueryVerification,您也会收到此错误。

于 2018-06-19T02:03:03.847 回答
0

修改您的 Dao,使用 Flowable 代替 observable 并添加以下依赖项(支持 rxjava 的房间)

compile group: 'android.arch.persistence.room', name: 'rxjava2', version: '1.1.1'

Dao 返回可流动的:

@Query("SELECT * FROM TableX")
public abstract Flowable<List<EntityX>> getAllXs();
于 2018-10-19T18:34:40.473 回答
0

对我来说,它是从 MutableLiveData 更改为 LiveData 作为 get 方法的返回类型。

于 2019-03-22T08:45:52.807 回答
0

当我尝试在查询中执行一些聚合函数时出现此错误,例如 sum 和 count,然后在列名中使用别名。

select count(users.id) as userCount, ...

userCount碰巧像上面的别名必须与模型中的字段名称匹配。

于 2019-04-08T08:25:18.493 回答
0

您必须在方法返回的类中包含 @Relation 注释。这是 Room 知道如何在两者之间建立关系的唯一方法。

于 2019-08-21T17:02:09.557 回答
0

确定是否有

查询有问题:[SQLITE_ERROR] SQL 错误或缺少数据库(没有这样的表:METRO)


您在描述中提到的错误之前的构建日志中的错误。如果是,您可能忘记将新实体 Pojo 添加到数据库类。像这样的东西

@Database(entities = {Table.class,ForgottenTable.class}, version = 1) 
public abstract class Database extends RoomDatabase {
    //class codes
}
于 2019-11-12T08:08:11.957 回答
0

就我而言,Room 不知道如何将 Cursor 转换为该方法的返回类型,即ArrayList ,所以我稍作更改,将 list 转换为 kotlin 的MutableListOf。现在它工作正常。

于 2020-12-26T18:31:43.827 回答
0

就我而言,升级版本有效。

以前的

api 'androidx.room:room-runtime:2.0.0'
annotationProcessor 'androidx.room:room-compiler:2.0.0'
api 'androidx.room:room-rxjava2:2.0.0'

现在

api 'androidx.room:room-runtime:+'
annotationProcessor 'androidx.room:room-compiler:+'
api 'androidx.room:room-rxjava2:+'

+表示最新版本,对我来说是 2.4.2

于 2022-03-01T04:10:14.283 回答
-1

将 Kotlin 版本从 1.5.21 更改回 1.3.61 后,此错误消失

于 2021-09-06T16:22:22.783 回答