簡體   English   中英

我是否必須使用 LiveData 從 Android - Kotlin 中的房間數據庫中讀取查詢

[英]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()而不使用LiveDataObserver

可能嗎?

這是最佳實踐嗎?

如果沒有 LiveData,我將不得不使用suspend fun來執行我的Query ,但是當我使用時:

fun updateShoppingItem(item: ShoppingItem) = CoroutineScope(Dispatchers.Main).launch {
    repository.updateShoppingItem(item)
}

它返回一個Job不是Query應該返回的類型。 如果我可以使用LiveData以外的其他東西,我該如何改變它。

我的想法:

  1. 沒有限制“您必須在房間中使用 LiveData”。 有“你可以使用 LiveData”( 鏈接到文檔)。 您還可以使用另一種技術實現模式 Observer- RxJavaCoroutines Flow 可以使用這些機制中的一種來實現數據中的反應性流 - 本地數據庫中的某些變化,您的片段/活動將立即觀察到該變化。
  2. 沒有“你不應該在房間里使用 LiveData”的限制。 在提到的文章中,它只是一個答案——“如果你不想使用 LiveData——那么你不應該使用它”。 可能有一些趨勢是用 Coroutines Flow 代替 Kotlin 中的 LiveData,但現在要求不高。
  3. 您也可以使用異步協程 在這種情況下,您將不會觀察到數據庫中的變化。 在您的 viewModel 中,借助KTX 擴展,您可以更輕松地調用掛起功能

    viewModelScope.launch(Dispatchers.IO) { repository.updateShoppingItem(item) }

  4. 但究竟有什么用,“你可以用這個”和“你可以用那個”太多了? 好吧,像往常一樣 - 這取決於,並且沒有單一的最佳方法,並且有很多“如果”。 如果您不需要在線觀察數據的變化並且您使用 Kotlin 並且您熟悉協程 - 您可以使用它們。 如果您在這種情況下使用 Java 並且您不熟悉 RxJava 並且不想研究它(仍然為什么?)您必須手動將所有使用 db 的代碼移動到另一個線程中。 如果您是 RxJava 粉絲 - 即使您使用 Kotlin,您也可以使用它。 如果您是 RxJava 粉絲,但又想站在趨勢的邊緣 - 您可以使用 Flow。

希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM