[英]Do I have to use LiveData to read Query from Room DataBase in Android - Kotlin
我使用 MVVM model 开发了一个简单的购物清单应用程序。
我有这些文件:
Database
(2 表:购物项目和参考项目)+ DAO
(唯一)Repository
(唯一)ViewModel
(唯一)Fragment
/ Activity
在DAO
中,我定义了所有查询。 目前,我所有的//Custom
查询都返回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>
然后在存储库中,他们都没有使用suspend fun
来调用。 因此,在 ViewModel 中,它们也不会使用suspend fun
来调用。
例如,我想使用getAllShoppingCount()
而不使用LiveData
和Observer
。
可能吗?
这是最佳实践吗?
如果没有 LiveData,我将不得不使用suspend fun
来执行我的Query
,但是当我使用时:
fun updateShoppingItem(item: ShoppingItem) = CoroutineScope(Dispatchers.Main).launch {
repository.updateShoppingItem(item)
}
它返回一个Job
不是Query
应该返回的类型。 如果我可以使用LiveData
以外的其他东西,我该如何改变它。
我的想法:
您也可以使用异步协程。 在这种情况下,您将不会观察到数据库中的变化。 在您的 viewModel 中,借助KTX 扩展,您可以更轻松地调用挂起功能
viewModelScope.launch(Dispatchers.IO) { repository.updateShoppingItem(item) }
但究竟有什么用,“你可以用这个”和“你可以用那个”太多了? 好吧,像往常一样 - 这取决于,并且没有单一的最佳方法,并且有很多“如果”。 如果您不需要在线观察数据的变化并且您使用 Kotlin 并且您熟悉协程 - 您可以使用它们。 如果您在这种情况下使用 Java 并且您不熟悉 RxJava 并且不想研究它(仍然为什么?)您必须手动将所有使用 db 的代码移动到另一个线程中。 如果您是 RxJava 粉丝 - 即使您使用 Kotlin,您也可以使用它。 如果您是 RxJava 粉丝,但又想站在趋势的边缘 - 您可以使用 Flow。
希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.