错误: Not sure how to convert a Cursor to this method’s return type
最近在使用Room+协程+LiveData查询数据的时候,我的查询方法定义如下:
@Query("select * from user")
suspend fun getAllUsers(): LiveData<List<User>>
然而编译的时候报错了,报错信息如下:
错误: Not sure how to convert a Cursor to this method's return type
如果把suspend关键字去掉,就不报错了。
原因:
我原本以为查询动作应该是耗时操作,正常来讲结合协程使用时应该要加上 suspend 关键字以便于查询的时候可以挂起,然而,如果在Room中方法返回值得类型定义为 LiveData 时,那么,该方法则默认是 异步 的。详情可以查看官方文档
https://developer.android.google.cn/topic/libraries/architecture/livedata.html#use_livedata_with_room
也就是说 suspend 关键字不能和 LiveData 同时出现。
解决办法
方法有两种
1.使用 suspend 关键字结合协程使用
代码如下
@Query("select * from user")
suspend fun getAllUsers(): List<User>
结合协程进行查询
viewModelScope.launch {
var users= withContext(Dispatchers.IO){
userDao.getAllUsers()
}
}
2.直接将LiveData作为返回值,查询时直接调用即可
/*当返回值类型为 LiveData 时,默认就是异步的 我们无需使用suspend关键字修饰,去掉*/
@Query("select * from user")
fun getAllUsers(): LiveData<List<User>>
使用的时候直接用就行,不用处理线程切换的逻辑
lateinit var users: LiveData<List<User>>
private var userDao: UserDao
init {
userDao = UserDataBase.instance.userDao()
/*查 由于getAllUsers返回类型为LiveData类型 默认就异步的 所以无需使用协程 */
users = userDao.getAllUsers()
}
至于上面两种方法如何选择,根据自己的喜好就行
如果你觉得本文对你有帮助,麻烦动动手指顶一下,算是对本文的一个认可,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢!
转载:https://blog.csdn.net/yuzhiqiang_1993/article/details/101534235
查看评论