【问题标题】:Android Room LiveData select query parametersAndroid Room LiveData 选择查询参数
【发布时间】:2018-02-24 19:56:18
【问题描述】:

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

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

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

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

我的数据库代码与this codelab中的代码不太一样

编辑:我终于这样做了:每次我想更新查询参数时,我都会从 DAO 中调用 select(通过 ViewModel 和 Repo),并将新的观察者添加到该新列表中。这个解决方案似乎不是最优的,但我想它可以工作......

【问题讨论】:

  • 您可以使用 Dao 拥有多个 select 语句
  • 我想过,但是假设我想要一个文本字段,用户可以在其中输入任何搜索字符串
  • 所以?这里有什么问题?虽然这些不需要选择语句。
  • 你的列表来自 select all 语句...然后从整个列表中过滤用户搜索的列表...并显示搜索到的列表
  • hmmm...所以基本上使用java而不是sql进行过滤...也许我会尝试。感谢您的想法

标签: android android-room


【解决方案1】:

我认为您的解决方案是 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 的值

希望对你有帮助。

【讨论】:

  • 终于有时间尝试您的解决方案,效果非常好!太感谢了!这正是我想要的。
  • @mjn42 是的,我修好了。关于错误,给我看代码,也许我能帮你
  • @mjn42 setValue, 当然
  • 您的代码帮助很大。但是该行有一个问题:private LiveData&lt;String&gt; filterColor = new MutableLiveData&lt;String&gt;();instead 使用private MutableLiveData&lt;String&gt; filterColor = new MutableLiveData&lt;String&gt;(); 因为 LiveData's setValue() 具有受保护的访问权限,而 MutableLiveData's setValue() 具有公共访问权限.
  • 救了我的命
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多