Ver*_*mCH 36 sqlite select android sql-in android-room
是否可以在INRoom中使用SQLite的条件?
我正在尝试从我的数据库中选择一个项目列表,其中某列的值(在本例中为TEXT列)与一组过滤器值中的任何一个匹配.根据我的知识,这很容易在SQL和SQLite中完成,只需IN在SELECT语句中添加一个条件(参见此处).但是,我似乎无法使它与Room合作.
我一直收到这个错误:
Error:(70, 25) error: no viable alternative at input 'SELECT * FROM Table WHERE column IN :filterValues'
Run Code Online (Sandbox Code Playgroud)
(@Query调用DAO 注释方法的输入filterValues)
我现在尝试了三种不同的方法:
List<String>String[]String,但格式化为(value_1, value_2, ..., value_n)特别是最后一个应该可以很容易地工作,因为它将(或者至少应该)直接转换为SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n),SELECT如果您只是直接访问数据库,这就是您手动写出的确切方式.
Ver*_*mCH 73
因此,当我准备提交这个时,我仔细检查了一堆我以前查过的东西,发现了我曾经错过的东西,并且可以保存这个问题.
事实证明,这两个选项:
List<String>String[]是可行的(您可以用String数据库可以表示的任何类型替换,例如char或int),您只需要更改@Query注释中的语法:
@Query("SELECT * FROM Table WHERE column IN :filterValues")
Run Code Online (Sandbox Code Playgroud)
对此:
@Query("SELECT * FROM Table WHERE column IN (:filterValues)")
Run Code Online (Sandbox Code Playgroud)
馅饼很简单吧?
请注意,上面的第三种方法(将参数简单地传递String,但格式化为(value_1, value_2, ..., value_n))似乎并不支持Room,但这可能不是一件坏事,因为这是困难的方法.
因为我已经完成了所有的事情,我想我会留下这个问题,以防其他人像我一样难以找到这个解决方案并偶然发现这个问题.
Ahm*_*deh 24
您好,您可以使用此查询:
@Query("SELECT * FROM user WHERE uid IN(:userIds)")
public abstract List findByIds(int[] userIds);
Run Code Online (Sandbox Code Playgroud)
要么
@Query("SELECT * FROM user WHERE uid IN(:userIds)")
public abstract List findByIds(List<Integer> userIds);
Run Code Online (Sandbox Code Playgroud)
Coo*_*ind 10
与上面的答案类似,Kotlin您可以使用vararg代替array或list:
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun getUsers(vararg userIds: Int): List<User>?
Run Code Online (Sandbox Code Playgroud)
并像repository.getUsers(1, 2, 3).
如果需要,转换vararg以list查看https://proandroiddev.com/kotlins-vararg-and-spread-operator-4200c07d65e1(使用*: format(output, *params))。