Android Room LiveData选择查询参数

时间:2018-02-24 19:56:19

标签: android android-room

这是我在Stack上的第一个问题。多年来一直在使用它,但我从未问过问题 - 我总是能够在现有问题中找到解决方案(或者在整个互联网上的其他各种网站上找到解决方案)。但我现在无法找到或提出解决方案几天了。

我决定通过一个简单的数据库应用程序自学Java和Android。我已经实现了一些功能" lazy"方式 - 所有选择都在主线程上完成。

现在我想使用LiveData进行选择。我已经使用LiveData和RecyclerView阅读了simplistic training guide on android developers并实施了a more complex solution from codelabs guide。插入,更新,删除和选择整个表的 可以完美地工作,但是我不知道如何传递参数来进行选择。

示例:我有一个活动,其中包含所有记录的可滚动列表,我想将一些过滤器应用于列表(搜索)。根据我的理解,来自DAO的实际select方法只被调用一次(创建ViewModel时),所以如何使用新参数更新查询?

其他示例:我有其他活动显示记录的所有列(用于查看和编辑)。 如何将ID传递给查询以选择单行?

我的数据库代码与this codelab

中的代码相同

编辑:我终于这样做了:每次我想更新查询参数时,我都会调用DAO中的select(通过ViewModel和Repo),并为该新列表添加一个新的观察者。这个解决方案看起来不是最佳的,但我猜它有效......

1 个答案:

答案 0 :(得分:14)

我认为您的解决方案是Transformations.switchMap。最简单的例子,它可以在codelab

的情况下工作
public class WordViewModel extends AndroidViewModel {
    private WordRepository mRepository;
    private LiveData<List<Word>> mAllWords;
    private LiveData<List<Word>> searchByLiveData;
    private LiveData<String> filterLiveData = new MutableLiveData<String>();

    public WordViewModel (Application application) {
        super(application);
        mRepository = new WordRepository(application);
        mAllWords = mRepository.getAllWords();
        searchByLiveData = Transformations.switchMap(filterLiveData, 
                                                     v -> mRepository.searchBy(v));
    }

    LiveData<List<Word>> getSearchBy() { return searchByLiveData; }
    void setFilter(String filter) { filterLiveData.setValue(filter); }
    LiveData<List<Word>> getAllWords() { return mAllWords; }
    public void insert(Word word) { mRepository.insert(word); }
}

因此,当您设置过滤器值时,它将更改searchByLiveData的值

我希望这会对你有所帮助。