作者:小鬼shenzhen | 来源:互联网 | 2022-12-31 12:34
是否可以在IN
Room中使用SQLite的条件?
我正在尝试从我的数据库中选择一个项目列表,其中某列的值(在本例中为TEXT
列)与一组过滤器值中的任何一个匹配.根据我的知识,这很容易在SQL和SQLite中完成,只需IN
在SELECT
语句中添加一个条件(参见此处).但是,我似乎无法使它与Room合作.
我一直收到这个错误:
Error:(70, 25) error: no viable alternative at input 'SELECT * FROM Table WHERE column IN :filterValues'
(@Query
调用DAO 注释方法的输入filterValues
)
我现在尝试了三种不同的方法:
将论证作为一个 List
将论证作为一个 String[]
最后将参数简单地传递给了String
,但格式化为(value_1, value_2, ..., value_n)
特别是最后一个应该可以很容易地工作,因为它将(或者至少应该)直接转换为SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n)
,SELECT
如果您只是直接访问数据库,这就是您手动写出的确切方式.
1> VerumCH..:
因此,当我准备提交这个时,我仔细检查了一堆我以前查过的东西,发现了我曾经错过的东西,并且可以保存这个问题.
事实证明,这两个选项:
将论证作为一个 List
将论证作为一个 String[]
是可行的(您可以用String
数据库可以表示的任何类型替换,例如char
或int
),您只需要更改@Query
注释中的语法:
@Query("SELECT * FROM Table WHERE column IN :filterValues")
对此:
@Query("SELECT * FROM Table WHERE column IN (:filterValues)")
馅饼很简单吧?
请注意,上面的第三种方法(将参数简单地传递String
,但格式化为(value_1, value_2, ..., value_n)
)似乎并不支持Room,但这可能不是一件坏事,因为这是困难的方法.
因为我已经完成了所有的事情,我想我会留下这个问题,以防其他人像我一样难以找到这个解决方案并偶然发现这个问题.
2> Ahmad Aghaza..:
您好,您可以使用此查询:
@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 userIds);