如何在分配给变量之前调整房间数据库中的实时数据
How to Adjust LiveData from Room Database Before It's Assigned to a Variable
我正在自学 Kotlin,基于一些非常古老的编码知识,所以我可能遗漏了一些非常明显的东西。
基本上,每次从 Room 数据库 returned 时,我都想稍微调整一些 LiveData。 LiveData 是一个键值对,即使请求的项目不在数据库中,我也想确保已分配键,因此 LiveData 永远不会为空。我已经尝试了多种方法来做到这一点——最近一次是使用 LiveData 构建器,但它在第一次时往往 return 为 null,然后永远不会更新。我认为我遇到的问题(我希望 LiveData 构建器能够解决)是 LiveData 没有及时从数据库中 returned 来进行调整。
我知道我可以用两个 LiveData 对象来做到这一点——观察直接来自数据库的那个,然后在将它分配给第二个变量之前执行调整——但我会用一个大量变量,必须有更清洁的方法。
这是我尝试的最后一件事。
在视图模型中:
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?>
我希望这个问题很清楚,不要太愚蠢!
我认为推荐的方法是通过转换 - 有关详细信息,请参阅 https://developer.android.com/codelabs/kotlin-android-training-live-data-transformations#0。
也就是说,LiveData 似乎即将淘汰(Android 发展很快!)您可能需要考虑改用 https://developer.android.com/kotlin/flow。
从 Room 查询返回 liveDate 不是正确的好方法。 LiveDate是生命周期组件,逻辑上最好不要使用。
有更好的选择,例如 Flow。它是反应式的,更清洁。此外,您可以通过将 suspend 关键字添加到方法签名并返回模型 class 本身来使用协程。
我正在自学 Kotlin,基于一些非常古老的编码知识,所以我可能遗漏了一些非常明显的东西。
基本上,每次从 Room 数据库 returned 时,我都想稍微调整一些 LiveData。 LiveData 是一个键值对,即使请求的项目不在数据库中,我也想确保已分配键,因此 LiveData 永远不会为空。我已经尝试了多种方法来做到这一点——最近一次是使用 LiveData 构建器,但它在第一次时往往 return 为 null,然后永远不会更新。我认为我遇到的问题(我希望 LiveData 构建器能够解决)是 LiveData 没有及时从数据库中 returned 来进行调整。
我知道我可以用两个 LiveData 对象来做到这一点——观察直接来自数据库的那个,然后在将它分配给第二个变量之前执行调整——但我会用一个大量变量,必须有更清洁的方法。
这是我尝试的最后一件事。
在视图模型中:
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?>
我希望这个问题很清楚,不要太愚蠢!
我认为推荐的方法是通过转换 - 有关详细信息,请参阅 https://developer.android.com/codelabs/kotlin-android-training-live-data-transformations#0。
也就是说,LiveData 似乎即将淘汰(Android 发展很快!)您可能需要考虑改用 https://developer.android.com/kotlin/flow。
从 Room 查询返回 liveDate 不是正确的好方法。 LiveDate是生命周期组件,逻辑上最好不要使用。
有更好的选择,例如 Flow。它是反应式的,更清洁。此外,您可以通过将 suspend 关键字添加到方法签名并返回模型 class 本身来使用协程。