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



至於上面兩種方法如何選擇,根據自己的喜好就行


如果你覺得本文對你有幫助,麻煩動動手指頂一下,算是對本文的一個認可,如果文中有什麼錯誤的地方,還望指正,轉載請註明轉自喻志強的博客 ,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章