77

是否可以将 SQLite 的IN条件与 Room 一起使用?

我正在尝试从我的数据库中选择一个项目列表,其中某个列(在本例中为TEXT列)的值与一组过滤器值中的任何一个匹配。据我所知,这在 SQL 和 SQLite 中很容易完成,只需在您的语句中添加一个IN条件(请参见此处)。但是,我似乎无法使其与 Room 一起使用。SELECT

我不断收到此错误:

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

(调用 DAO@Query注释方法的输入filterValues

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

  1. 将参数作为List<String>
  2. 将参数作为String[]
  3. 最后将参数简单地传递为 a String,但格式为(value_1, value_2, ..., value_n)

特别是最后一个应该很容易工作,因为它将(或至少应该)直接转换为,如果您只是直接访问数据库SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n),这就是您手动写出的确切方式。SELECT

4

3 回答 3

134

所以当我准备提交这个的时候,我仔细检查了一堆我之前查过的东西,发现了我不知何故错过的东西,并且可以避免这个问题的必要性。

事实证明,这两个选项:

  1. 将参数作为List<String>
  2. 将参数作为String[]

是可行的(并且您可以用String数据库可以表示的任何类型替换,例如charor int),您只需@Query从以下更改注释中的语法:

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

对此:

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

像馅饼一样容易,对吧?

请注意,Room 似乎不支持上面的第三种方法(将参数简单地传递为 a String,但格式化为),但这可能不是一件坏事,因为这是一种艰难的方式。(value_1, value_2, ..., value_n)

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

于 2018-01-23T16:14:26.233 回答
50

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

 @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);
于 2018-05-12T18:39:32.923 回答
15

与上述答案类似,Kotlin您可以使用vararg代替arrayor list

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

并像repository.getUsers(1, 2, 3).

如果需要,转换vararglist查看https://proandroiddev.com/kotlins-vararg-and-spread-operator-4200c07d65e1(使用*:)format(output, *params)

于 2020-06-08T16:28:04.180 回答