是否可以使用 SQLite 的 IN
房间条件如何?
我正在尝试从我的数据库中选择一个项目列表,其中某个列的值(在本例中为 TEXT
列)与一组过滤器值中的任何一个匹配。据我所知,这在 SQL 和 SQLite 中很容易完成,只需添加 IN
条件您的SELECT
声明(see here)。但是,我似乎无法让它与 Room 一起使用。
我不断收到此错误:
Error:(70, 25) error: no viable alternative at input 'SELECT * FROM Table WHERE column IN :filterValues'
(DAO 的输入为 @Query
-annotated 方法称为 filterValues
)
我现在尝试了三种不同的方法:
- 将参数作为
List<String>
传递 - 将参数作为
String[]
传递 - 最后将参数简单地传递为
String
, 但格式为(value_1, value_2, ..., value_n)
最后一个应该很容易工作,因为它将(或至少应该)直接转换为 SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n)
,这是您手动写出 SELECT
的确切方式如果您只是直接访问数据库。
最佳答案
所以当我准备提交这个问题时,我仔细检查了一堆我之前查过的东西,发现我不知何故错过了一些东西,并且可以避免这个问题的必要性。
事实证明,这两个选项:
- 将参数作为
List<String>
传递 - 将参数作为
String[]
传递
是可行的(您可以将 String
替换为数据库可以表示的任何类型,例如 char
或 int
),您只需更改 @Query
中的语法来自此的注释:
@Query("SELECT * FROM Table WHERE column IN :filterValues")
到这里:
@Query("SELECT * FROM Table WHERE column IN (:filterValues)")
很容易,对吧?
请注意,Room 似乎不支持上面的第三种方法(将参数简单地传递为 String
,但格式化为 (value_1, value_2, ..., value_n)
),但这可能不是一件坏事,因为这是一种艰难的方式。
由于我已经输入了整个内容,我想我会留下这个问题,以防其他人像我一样难以找到这个解决方案并偶然发现这个问题。
关于android - 房间 - 选择带有 IN 条件的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48406228/