簡體   English   中英

Android Room + ViewModel的用法

[英]Android Room + ViewModel usage

我想為我的應用程序使用android的Room + ViewModel組件,但是我不確定如何使用。 我的數據庫表之一將代表類別的條目。 類別數將根據用戶而變化,因此我不會為每個類別創建不同的表。 我需要對這些數據進行一些計算,其中一個是對不同列表中的數據進行排序,但這將與我在應用程序中的所有片段相關。 如果我想使用實時數據,該怎么做?

我能找到的所有示例最終都獲得或觀察到了活動/片段中的數據。 但是,鑒於我將需要對這些數據進行這些計算,並且它與所有片段都相關,我是否應該在ViewModel中獲取該數據並在那里計算所有內容,而只為片段獲取吸氣劑?

如果我想為此使用LiveData,該如何在VIewModel中注冊觀察者,在其中的onChanged中計算事物,並根據ViewModel中的內容創建另一個LiveData,然后讓片段監聽該新LiveData呢?

還有一件事,如果我最終使用LiveData並且不知道將要存在多少個類別,我是否偵聽所有表條目,並在檢測到更改后重新計算所有內容,還是創建不同的偵聽器?基於"... WHERE CategoryID = :categoryID"以避免在僅添加一個類別條目時重新計算所有內容?

您應該在ViewModel獲取該數據,處理該數據,並讓Fragments共享該ViewModel實例。 查看ViewModel指南的這一部分,以了解如何在片段之間共享ViewModels


如果我想為此使用LiveData,該如何在VIewModel中注冊觀察者,在其中的onChanged中計算事物,並根據ViewModel中的內容創建另一個LiveData,然后讓片段監聽該新LiveData呢?

不能。而是使用LiveData.observeForever在ViewModel中注冊觀察者。

ExampleViewModel

class ExampleViewModel extends ViewModel {

    private final LiveData<Data> myLiveData;
    private final Observer<Data> myObserver;

    ExampleViewModel() {
        // Step 1: get LiveData and instantiate observer
        myLiveData = myRepository.getMyData();
        myObserver = (data) -> {...};

        // Step 2: use observeForever to observe the LiveData
        myLiveData.observeForever(myObserver);
    }


    @Override
    void onCleared () {
        // Step 3: remove observer
        myLiveData.removeObserver(myObserver);
    }
}


如果我最終使用LiveData並且不知道將要存在多少個類別,我是否偵聽所有表條目,並在檢測到更改后重新計算所有內容,還是基於"... WHERE CategoryID = :categoryID"創建其他偵聽器? "... WHERE CategoryID = :categoryID"以避免在僅添加一個類別條目時重新計算所有內容?

Room知道表何時更改,但不知道表如何更改,因此即使您在查詢中指定categoryID並且特定類別沒有更改,Room也會重新計算所有內容。 為每個類別創建不同的偵聽器不會減少計算成本,只會使您的邏輯更加復雜。 相反,您應該收聽整個表,或者如果計算量太大,則不要使用LiveData並進行一些一次性查找。

暫無
暫無

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

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