我正在实现一个Room数据库(因为我想远离Loaders)并且我有一个查询根据IN
运算符选择对象:
@Query(SELECT * FROM table WHERE icon IN(:icons))
LiveData<List<Result>> getResults(String[] icons);
问题是:icons
数组是在运行时动态生成的,首先我为它生成占位符,然后用值替换它们,如下所示:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String[] iconsArray = generateIconArray();
mViewModel = ViewModelProviders.of(this, new MyViewModelFactory(getActivity().getApplication(), iconsArray)).get(MyViewModel.class);
mViewModel.getResults().observe(this, new Observer<List<Result>>() {
@Override
public void onChanged(@Nullable List<Result> results) {
RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getActivity(), 3);
mRecyclerView.setLayoutManager(layoutManager);
GridAdapter adapter = new GridAdapter(getActivity(), results);
mRecyclerView.setAdapter(adapter);
}
});
}
问题是我收到一个空的RecyclerView,但是当我传递一个带有单个图标的数组时,查询工作正常。
是不是可以在Room中实现相同,因为它在编译期间检查查询?
如果没有,那么我应该在我的存储库构造函数中使用db.query(...)
而不是那样吗?
我知道这个问题被问到here,但它也表示他们正在研究它,我找不到任何迹象。
修改
如果有人偶然发现这个问题,我在实现此功能时犯了一个小错误,onActivityCreated
中提供的代码实际上有效。还值得一提的是,它适用于String[]
和列表,但不能使用单个字符串:"ab,cd,ef"
。
答案 0 :(得分:0)
我在实现此功能时犯了一个小错误,onActivityCreated
中提供的代码实际上有效。值得一提的是,它适用于String[]
和List
,但不适用于单String
:“ab,cd,ef”,这是我的错误。