Android Room + ViewModel 用法
Android Room + ViewModel usage
我想为我的应用程序使用 android 的 Room + ViewModel 组件,但我不太确定如何使用。我的数据库 table 之一将代表类别的条目。类别数量将根据用户而变化,因此我不会为每个类别创建不同的 table。我需要对这些数据做一些计算,一个是对不同列表中的数据进行排序,但它会与我在应用程序中的所有片段相关。如果我想为此使用实时数据,我该怎么做?
我能找到的所有示例最终都得到或观察到 activities/fragments 中的数据。但是考虑到我需要对这些数据进行这些计算并且它将与所有片段相关,我是否应该在我的 ViewModel 中获取该数据并在那里计算所有内容并为我的片段留下吸气剂?
如果我想为此使用 LiveData 怎么办,我是否要在 VIewModel 中注册观察者,在那里的 onChanged 中计算事物,然后在 ViewModel 中从中创建另一个 LiveData 并让片段监听那个新的 LiveData?
还有一件事,如果我最终使用 LiveData 并且我不知道那里会有多少类别,我是否会收听所有 table 条目,并在更改后重新计算所有内容被检测到,或者我是否基于 "... WHERE CategoryID = :categoryID"
创建不同的侦听器以避免在仅添加一个类别条目时重新计算所有内容?
您应该在 ViewModel
中获取数据,处理数据,然后让 ViewModel
实例由 Fragments
共享。查看 ViewModel 指南的 this 部分,了解如何在片段之间共享 ViewModels
。
如果我想为此使用 LiveData 怎么办,我是否要在 VIewModel 中注册观察者,在那里的 onChanged 中计算事物,并从 ViewModel 中的那个创建另一个 LiveData 并让片段听那个新的 LiveData ?
没有。相反,使用 LiveData.observeForever
.
在 ViewModel 中注册 observerd
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 并且我不知道会有多少类别,我是否会收听所有 table 条目,以及 re-calculate 所有内容一旦检测到更改,或者我是否基于 "... WHERE CategoryID = :categoryID"
创建不同的侦听器以避免 re-calculating 仅添加一个类别条目时的所有内容?
Room 知道 table 何时更改,但不知道 table 是如何更改的,因此它会 re-calculate 一切,即使您指定 categoryID 在查询中并且该特定类别没有更改。为每个类别创建不同的侦听器不会减少计算成本,只会使您的逻辑更加复杂。你应该改为听整个 table,或者如果计算量太大,则不要使用 LiveData
并做一些 one-time look-ups。
我想为我的应用程序使用 android 的 Room + ViewModel 组件,但我不太确定如何使用。我的数据库 table 之一将代表类别的条目。类别数量将根据用户而变化,因此我不会为每个类别创建不同的 table。我需要对这些数据做一些计算,一个是对不同列表中的数据进行排序,但它会与我在应用程序中的所有片段相关。如果我想为此使用实时数据,我该怎么做?
我能找到的所有示例最终都得到或观察到 activities/fragments 中的数据。但是考虑到我需要对这些数据进行这些计算并且它将与所有片段相关,我是否应该在我的 ViewModel 中获取该数据并在那里计算所有内容并为我的片段留下吸气剂?
如果我想为此使用 LiveData 怎么办,我是否要在 VIewModel 中注册观察者,在那里的 onChanged 中计算事物,然后在 ViewModel 中从中创建另一个 LiveData 并让片段监听那个新的 LiveData?
还有一件事,如果我最终使用 LiveData 并且我不知道那里会有多少类别,我是否会收听所有 table 条目,并在更改后重新计算所有内容被检测到,或者我是否基于 "... WHERE CategoryID = :categoryID"
创建不同的侦听器以避免在仅添加一个类别条目时重新计算所有内容?
您应该在 ViewModel
中获取数据,处理数据,然后让 ViewModel
实例由 Fragments
共享。查看 ViewModel 指南的 this 部分,了解如何在片段之间共享 ViewModels
。
如果我想为此使用 LiveData 怎么办,我是否要在 VIewModel 中注册观察者,在那里的 onChanged 中计算事物,并从 ViewModel 中的那个创建另一个 LiveData 并让片段听那个新的 LiveData ?
没有。相反,使用 LiveData.observeForever
.
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 并且我不知道会有多少类别,我是否会收听所有 table 条目,以及 re-calculate 所有内容一旦检测到更改,或者我是否基于 "... WHERE CategoryID = :categoryID"
创建不同的侦听器以避免 re-calculating 仅添加一个类别条目时的所有内容?
Room 知道 table 何时更改,但不知道 table 是如何更改的,因此它会 re-calculate 一切,即使您指定 categoryID 在查询中并且该特定类别没有更改。为每个类别创建不同的侦听器不会减少计算成本,只会使您的逻辑更加复杂。你应该改为听整个 table,或者如果计算量太大,则不要使用 LiveData
并做一些 one-time look-ups。