![](/img/trans.png)
[英]Android/Room/ViewModel : Error while saving ViewModel to Room Database
[英]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.