Android Room LiveData select 查询参数

Android Room LiveData select query parameters

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

现在我想使用 LiveData selects。我已经阅读了 simplistic training guide on android developers and implemented a more complex solution from codelabs guide,其中包含 LiveData 和 RecyclerView。插入、更新、删除和 selects for whole tables 工作完美,但我不知道如何将参数传递给 selects.

示例:我有一个 activity,其中包含所有记录的可滚动列表,我想对列表应用一些过滤器(搜索)。据我了解,DAO 中的实际 select 方法仅调用一次(创建 ViewModel 时),因此 如何使用新参数更新查询?

其他示例:我有其他 activity 显示记录的所有列(用于查看和编辑)。 如何将 id 传递给 select 单行查询?

我的数据库代码与 this codelab

中的差不多

编辑: 我终于这样做了:每次我想更新查询参数时,我都会从 DAO(通过 ViewModel 和 Repo)调用 select 并添加一个新名单的新观察员。这个解决方案似乎不是最优的,但我想它可行...

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

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

    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 的值

希望对您有所帮助。