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 的值
希望对您有所帮助。
我决定通过开发一个简单的数据库应用程序自学 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 的值
希望对您有所帮助。