使用占位符

时间:2018-04-05 12:49:17

标签: java android android-room android-architecture-components

我正在实现一个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"

1 个答案:

答案 0 :(得分:0)

我在实现此功能时犯了一个小错误,onActivityCreated中提供的代码实际上有效。值得一提的是,它适用于String[]List,但不适用于单String:“ab,cd,ef”,这是我的错误。