Android Room + ViewModel的用法

时间:2019-05-19 12:23:19

标签: android android-architecture-components android-livedata android-viewmodel

我想为我的应用程序使用android的Room + ViewModel组件,但是我不太确定如何使用。我的数据库表之一将代表类别的条目。类别数将根据用户而变化,因此我不会为每个类别创建不同的表。我需要对这些数据进行一些计算,其中一个是对不同列表中的数据进行排序,但这将与我在应用程序中的所有片段相关。如果我想使用实时数据,该怎么做?

我能找到的所有示例最终都获得或观察到了活动/片段中的数据。但是,鉴于我将需要对这些数据进行这些计算,并且它与所有片段都相关,因此我应该在ViewModel中获取该数据并在那里计算所有内容,然后只为片段获取吸气剂吗?

如果我想为此使用LiveData,该如何在VIewModel中注册观察者,在其中的onChanged中计算事物,并根据ViewModel中的内容创建另一个LiveData,然后让片段监听该新LiveData?

还有一件事,如果我最终使用LiveData而又不知道会有多少个类别,我会听所有表条目,并在检测到更改后重新计算所有内容,还是基于"... WHERE CategoryID = :categoryID"创建不同的侦听器,以避免在仅添加一个类别条目时重新计算所有内容?

1 个答案:

答案 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并进行一次一次性查找。