Android Room提示 错误: Not sure how to convert a Cursor to this method's return type的原因及解决办法

错误: Not sure how to convert a Cursor to this method’s return type

最近在使用Room+协程+LiveData查询数据的时候,我的查询方法定义如下:

    @Query("select * from user")
   suspend  fun getAllUsers(): LiveData>

然而编译的时候报错了,报错信息如下:

错误: 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

结合协程进行查询

        viewModelScope.launch { 
            var users= withContext(Dispatchers.IO){
                userDao.getAllUsers()
            }
        }

2.直接将LiveData作为返回值,查询时直接调用即可

    /*当返回值类型为 LiveData 时,默认就是异步的 我们无需使用suspend关键字修饰,去掉*/
    @Query("select * from user")
    fun getAllUsers(): LiveData>


使用的时候直接用就行,不用处理线程切换的逻辑


    lateinit var users: LiveData>
    private var userDao: UserDao
    
    init {
        userDao = UserDataBase.instance.userDao()

        /*查  由于getAllUsers返回类型为LiveData类型  默认就异步的 所以无需使用协程 */
        users = userDao.getAllUsers()
    }



至于上面两种方法如何选择,根据自己的喜好就行


如果你觉得本文对你有帮助,麻烦动动手指顶一下,算是对本文的一个认可,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢!

你可能感兴趣的:(Android,错误:,Not,sure,how,to,convert,a,Curso,suspend,LiveData,room,liveData,room,suspend)