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

时间:2017-09-27 10:48:52

标签: android dao android-room kapt 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.

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

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

我可以发布整个DAO类,但是我想知道哪种方法失败。我尝试使用Run with --stacktraceRun with --info--debug option,但这些都没有显示任何有价值的信息。

我添加的方法是@Query UPDATE Int返回类型,如documentation

中所述
  

UPDATE或DELETE查询可以返回void或int。如果它是一个int,那么   value是受此查询影响的行数。

编辑:我想补充一点,我尝试删除该方法,将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

21 个答案:

答案 0 :(得分:29)

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

答案 1 :(得分:17)

最近我遇到了同样的问题,但是我在select to_char(d,'YYYY-MM-DD'), mn.meter_number, count(meter_data.*) from generate_series ('2019-07-01'::date, '2019-07-06'::date, '1 day') d cross join (select 92589492 as meter_number) mn left join meter_data on meter_data.read_time=d and mn.meter_number=meter_data.meter_number group by d, mn.meter_number order by mn.meter_number, d; 函数中使用了Coroutines,例如:

Dao

并且无法编译,但是在删除@Query("SELECT * FROM Dummy") suspend fun get(): LiveData<List<Dummy>> 之后,一切正常。返回suspend时不需要。 LiveDatasuspend似乎无法协同工作(到目前为止)。

答案 2 :(得分:4)

在我的情况下,当我在Dao类中使用LiveData<ArrayList<Example Class>>从Room获取所有内容时遇到了这个问题,而当我用ArrayList更改List时,我解决了这个问题。

示例(科特琳):

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

答案 3 :(得分:2)

在build.gradle

中的defaultConfig中添加以下代码
javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true

答案 4 :(得分:2)

对于在此登陆的任何人,使用coroutine Flow作为返回类型,如果不小心使函数挂起,则会出现此错误。由于它正在返回流,因此无需暂停。

所以代替这个:

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

使用此功能(不使用suspend修饰符):

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

答案 5 :(得分:2)

我整天都在这个问题上。解决方案非常简单。

之前,我曾使用过类似的方法
@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上使用。没有一种组合有效。

希望这对某人有帮助。

答案 6 :(得分:1)

万一有人在使用MutableLiveData<List<T>>并使用RoomKotlin时在ViewModel中确实需要coroutines,这就是我解决的方法

在Dao中,我得到suspend的MutableList
在存储库中,我将上下文更改为Dispatchers.IO并使用suspend提取列表
在ViewModel中,我将postValue与init一起使用,语法在下面

ViewModel

    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>

答案 7 :(得分:0)

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

答案 8 :(得分:0)

@Query("select * from movie_action")
    suspend fun getMovieActionRoom() : LiveData<List<MoviesActionModel>>

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

答案 9 :(得分:0)

在我的情况下,我对androidxRoom使用了android.arch.依赖性,而对ViewModelLiveData使用了旧的依赖性,所以得到了这个消息

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

答案 10 :(得分:0)

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

@Query("SELECT * FROM ...")
fun getAllTellsByReceiver(receiverUid: String): LiveData<List<Tell>>

答案 11 :(得分:0)

确定是否存在

  

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


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

@Database(entities = {Table.class,ForgottenTable.class}, version = 1) 
public abstract class Database extends RoomDatabase {
    //class codes
}

答案 12 :(得分:0)

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

因此,我正在尝试返回实际的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

但是,正如我没记错的那样,官方文档还指出here房间支持Cursor

尝试调试错误日志并打开MyTableDao_Impl.java文件后,我发现Cursorsuspend关键字的关系不健康。

因此,我已经更正了我的代码,如下所示:

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

瞧,它起作用了。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

当我尝试在查询中执行一些汇总函数(例如求和和计数,然后在列名称中使用别名)时出现此错误。

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

碰巧,上面的userCount之类的别名必须与模型中的字段名称匹配

答案 15 :(得分:0)

对我来说,我在查询中使用了错误的返回类型。

答案 16 :(得分:0)

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

答案 17 :(得分:0)

因为这是因为将AndroidX与Pre-AndroidX混合使用。经过完全迁移和performing this,一切恢复正常。 (当然,我也移到了AndroidX-Room)

答案 18 :(得分: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();

答案 19 :(得分: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,您也会收到此错误。

答案 20 :(得分:0)

对于我的情况,得到&#34;不确定如何将Cursor转换为此方法的返回类型“:

删除&#34; build&#34;并重新构建,错误消失。