我想为我的应用程序使用android的Room + ViewModel组件,但是我不太确定如何使用。我的数据库表之一将代表类别的条目。类别数将根据用户而变化,因此我不会为每个类别创建不同的表。我需要对这些数据进行一些计算,其中一个是对不同列表中的数据进行排序,但这将与我在应用程序中的所有片段相关。如果我想使用实时数据,该怎么做?
我能找到的所有示例最终都获得或观察到了活动/片段中的数据。但是,鉴于我将需要对这些数据进行这些计算,并且它与所有片段都相关,因此我应该在ViewModel中获取该数据并在那里计算所有内容,然后只为片段获取吸气剂吗?
如果我想为此使用LiveData,该如何在VIewModel中注册观察者,在其中的onChanged中计算事物,并根据ViewModel中的内容创建另一个LiveData,然后让片段监听该新LiveData?
还有一件事,如果我最终使用LiveData而又不知道会有多少个类别,我会听所有表条目,并在检测到更改后重新计算所有内容,还是基于"... WHERE CategoryID = :categoryID"
创建不同的侦听器,以避免在仅添加一个类别条目时重新计算所有内容?
答案 0 :(得分:1)
您应该在ViewModel
中获取该数据,处理该数据,并让ViewModel
共享该Fragments
实例。查看ViewModel指南的this部分,了解如何在片段之间共享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"
的侦听器,以避免在仅添加一个类别条目时重新计算所有内容?
Room知道表何时更改,但不知道表如何更改,因此即使您在查询中指定 categoryID 并且特定类别未更改,它也会重新计算所有内容。 。为每个类别创建不同的侦听器不会减少计算成本,只会使您的逻辑更加复杂。您应该改为监听整个表,或者如果计算量太大,则不要使用LiveData
并进行一次一次性查找。