是否可以在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
)
我现在尝试了三种不同的方法:
List<String>
String[]
String
,但格式为(value_1, value_2, ..., value_n)
特别是最后一个应该很容易,因为它会(或者至少应该)直接转换为SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n)
,这就是你手动写出SELECT
的确切方式只是直接访问数据库。
答案 0 :(得分:56)
因此,当我准备提交此内容时,我仔细检查了一堆我之前查过的内容,并发现了我曾经错过的内容,并且会将此问题保存为必要。
事实证明,这两个选项都是:
List<String>
String[]
是可行的(您可以用数据库可以表示的任何类型替换String
,例如char
或int
),您只需要更改{{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
代替array
或list
:
@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)
)。