这是我在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),并为该新列表添加一个新的观察者。这个解决方案看起来不是最佳的,但我猜它有效......
答案 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的值
我希望这会对你有所帮助。