【问题标题】:How to Adjust LiveData from Room Database Before It's Assigned to a Variable如何在将房间数据库中的 LiveData 分配给变量之前对其进行调整
【发布时间】:2021-02-09 17:11:26
【问题描述】:

我正在自学 Kotlin,基于一些非常古老的编码知识,所以我可能会遗漏一些非常明显的东西。

基本上,每次从 Room 数据库返回时,我都想稍微调整一些 LiveData。 LiveData 是一个键值对,即使请求的项目不在数据库中,我也想确保分配了键,因此 LiveData 永远不会为空。我尝试了多种方法来做到这一点——最近一次是使用 LiveData 构建器,但它往往第一次返回 null,然后永远不会更新。我认为我遇到的问题(我希望 LiveData 构建器能够解决)是 LiveData 没有及时从数据库返回以进行调整。

我知道我可以用两个 LiveData 对象来做到这一点——观察一个直接来自数据库的对象,然后在将它分配给第二个变量之前执行调整——但我会用大量的数据来做这件事变量,并且必须有更清洁的方法。

这是我尝试的最后一件事。

在 ViewModel 中:

    val myLiveData = liveData {
        val rawLiveData = database.get("key")
        emit(myDataClass("key", rawLiveData.value?.plotInput.toString().trim()))
    }

在 DAO 中

    @Query("SELECT * from database_table WHERE key = :key")
    fun get(key: String): LiveData<myDataClass?>

我希望这是清楚的,而不是太愚蠢的问题!

【问题讨论】:

    标签: kotlin android-room android-livedata


    【解决方案1】:

    从 Room 查询返回 liveDate 不是正确的好方法。 LiveDate 是一个生命周期组件,最好不要在逻辑中使用它。

    还有更好的选择,例如 Flow。它是反应性的,更清洁。此外,您可以通过在方法签名中添加 suspend 关键字并返回模型类本身来使用协程。

    【讨论】:

      【解决方案2】:

      我认为推荐的方法是通过转换来实现这一点——有关详细信息,请参阅 https://developer.android.com/codelabs/kotlin-android-training-live-data-transformations#0

      也就是说,LiveData 似乎即将淘汰(Android 发展迅速!),您可能需要考虑改用 https://developer.android.com/kotlin/flow

      【讨论】:

      • 谢谢。我想我误解了转换的目的。我还认为 flow 是针对字符串而不是单个值的,但我一定是错的。我会调查这些!
      猜你喜欢
      • 2019-10-10
      • 2020-04-08
      • 2018-04-14
      • 2019-03-04
      • 1970-01-01
      • 2022-07-11
      • 2018-09-03
      • 2020-06-29
      • 2018-08-27
      相关资源
      最近更新 更多