在Android-Kotlin中,我必须使用LiveData从房间数据库读取查询吗

在Android-Kotlin中,我必须使用LiveData从房间数据库读取查询吗,android,android-room,android-mvvm,Android,Android Room,Android Mvvm,我使用MVVM模型开发了一个简单的购物清单应用程序 我有这些文件: 数据库(2个表:购物项目和参考项目)+DAO(唯一) 存储库(唯一) ViewModel(唯一) 片段/活动 在DAO中,我定义了所有查询。当前,我所有的//自定义查询返回的LiveData类型如下: @Dao interface ShoppingDao { // Shopping Items @Insert(onConflict = OnConflictStrategy.REPLACE) susp

我使用MVVM模型开发了一个简单的购物清单应用程序

我有这些文件:

  • 数据库
    (2个表:购物项目和参考项目)+
    DAO
    (唯一)
  • 存储库
    (唯一)
  • ViewModel
    (唯一)
  • 片段
    /
    活动
DAO
中,我定义了所有查询。当前,我所有的
//自定义
查询返回的
LiveData
类型如下:

@Dao
interface ShoppingDao {

    // Shopping Items
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertShoppingItem(item: ShoppingItem)

    @Delete
    suspend fun deleteShoppingItem(item: ShoppingItem)

    @Update
    suspend fun updateShoppingItem(item: ShoppingItem)

    @Query(value = "DELETE FROM shopping_items")
    suspend fun deleteAllShoppingItems()

    @Query(value = "SELECT * FROM shopping_items")
    fun getAllShoppingItem(): LiveData<List<ShoppingItem>>

    // Custom
    @Query(value = "SELECT COALESCE(SUM(item_amount),0) FROM shopping_items")
    fun getAllShoppingCount(): LiveData<Int>

    @Query(value = "SELECT COALESCE(SUM(item_total_price), 0.0) FROM shopping_items")
    fun getAllShoppingTotal(): LiveData<Float>
它返回一个
作业
而不是
查询
应该返回的类型。如果我可以使用除
LiveData

我的想法以外的其他东西,我该如何改变这一点:

  • 没有限制“您必须在房间中使用LiveData”。这里有“你可以使用LiveData”()。您还可以使用另一种技术实现模式观察者-。您可以使用这些机制来实现数据中的反应流-本地数据库中的某些变化,您的片段/活动将立即观察到这种变化
  • 并没有限制“你们不应该在房间里使用LiveData”。在上面提到的文章中,这只是一个答案——“如果您不想使用LiveData,那么就不应该使用它”。可能是这样,现在有一种趋势,就是用协程流替换Kotlin中的LiveData,但现在要求不高
  • 您可以使用异步。在这种情况下,您将无法观察到数据库中的更改。在viewModel中,您可以借助

    viewModelScope.launch(Dispatchers.IO){
    repository.updateShoppingItem(项目)
    }

  • 但是到底用什么呢,有太多的“你可以用这个”和“你可以用那个”?嗯,和往常一样——这要看情况而定,没有单一的最佳方法,而且有很多“如果”。如果您不需要在线观察数据的变化,并且您使用Kotlin,并且您熟悉协同程序,那么您可以使用它们。如果您在这种情况下使用Java,并且您不熟悉RxJava,并且不想学习它(仍然是为什么?),那么您必须费心手动将使用db的所有代码移动到另一个线程中。如果你是一个RxJava迷,即使你使用Kotlin,你也可以使用它。如果你是RxJava的粉丝,但你想站在趋势的边缘,你可以使用Flow


  • 希望这会有所帮助。

    它应该会帮助您:谢谢,但不要依赖所有问题的答案。我以前读过,但它只是说Dao不应该在之后返回LiveData?您不能在主线程中访问数据库,所以首先需要使用Dispatcher.IO,然后使用suspend before Dao函数并为其设置返回类型
    fun updateShoppingItem(item: ShoppingItem) = CoroutineScope(Dispatchers.Main).launch {
        repository.updateShoppingItem(item)
    }