房间 - 选择IN状态的查询?

时间:2018-01-23 16:14:26

标签: android sqlite select android-room sql-in

是否可以在Room中使用SQLite的IN条件?

我正在尝试从我的数据库中选择一个列表,其中某列的值(在本例中为TEXT列)与一组过滤值中的任何一个匹配。根据我的知识,只需在IN语句(see here)中添加SELECT条件,就可以轻松地在SQL和SQLite中完成。但是,我似乎无法使它与Room合作。

我一直收到这个错误:

Error:(70, 25) error: no viable alternative at input 'SELECT * FROM Table WHERE column IN :filterValues'

(DAO @Query的输入 - 带注释的方法称为filterValues

我现在尝试了三种不同的方法:

  1. 将参数作为List<String>
  2. 传递
  3. 将参数作为String[]
  4. 传递
  5. 最后将论点简单地称为String,但格式为(value_1, value_2, ..., value_n)
  6. 特别是最后一个应该很容易,因为它会(或者至少应该)直接转换为SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n),这就是你手动写出SELECT的确切方式只是直接访问数据库。

3 个答案:

答案 0 :(得分:56)

因此,当我准备提交此内容时,我仔细检查了一堆我之前查过的内容,并发现了我曾经错过的内容,并且会将此问题保存为必要。

事实证明,这两个选项都是:

  1. 将参数作为List<String>
  2. 传递
  3. 将参数作为String[]
  4. 传递

    是可行的(您可以用数据库可以表示的任何类型替换String,例如charint),您只需要更改{{1}中的语法来自此的注释:

    @Query

    到此:

    @Query("SELECT * FROM Table WHERE column IN :filterValues")
    

    很容易就是馅饼,对吗?

    请注意,上面的第三种方法(将参数简单地传递为@Query("SELECT * FROM Table WHERE column IN (:filterValues)") ,但格式为String)似乎并不支持Room,但这可能不是一件坏事,因为那是困难的方式。

    由于我已经输入了整件事,我想我会留下这个问题,以防其他人像我一样难以找到这个解决方案并偶然发现这个问题。

答案 1 :(得分:15)

您好,您可以使用此查询:

 @Query("SELECT * FROM user WHERE uid IN(:userIds)")
 public abstract List findByIds(int[] userIds);

 @Query("SELECT * FROM user WHERE uid IN(:userIds)")
 public abstract List findByIds(List<Integer> userIds);

答案 2 :(得分:2)

与上述Kotlin中的答案类似,您可以使用vararg代替arraylist

@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun getUsers(vararg userIds: Int): List<User>?

,并像repository.getUsers(1, 2, 3)一样使用它。

如果需要,将vararg转换为list参见https://proandroiddev.com/kotlins-vararg-and-spread-operator-4200c07d65e1(使用*format(output, *params))。