錯誤: 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()
}
至於上面兩種方法如何選擇,根據自己的喜好就行
如果你覺得本文對你有幫助,麻煩動動手指頂一下,算是對本文的一個認可,如果文中有什麼錯誤的地方,還望指正,轉載請註明轉自喻志強的博客 ,謝謝!