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<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()
    }



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


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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喻志强(Xeon)

码字不易,鼓励随意。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值