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 --stacktrace
,Run 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
答案 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
时不需要。 LiveData
和suspend
似乎无法协同工作(到目前为止)。
答案 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>>
并使用Room
和Kotlin
时在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)
在我的情况下,我对androidx
和Room
使用了android.arch.
依赖性,而对ViewModel
和LiveData
使用了旧的依赖性,所以得到了这个消息>
解决方案:
要么使用所有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
文件后,我发现Cursor
与suspend
关键字的关系不健康。
因此,我已经更正了我的代码,如下所示:
@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;并重新构建,错误消失。