Room - Select query with IN condition?

人走茶凉 提交于 2020-03-17 04:18:32

问题


Is it possible to use SQLite's IN condition with Room?

I'm trying to select a list of items from my database where the value of a certain column (in this case a TEXT column) matches any one of a set of filter values. That's pretty easily done in SQL and SQLite, by my knowledge, just by adding an IN condition to your SELECT statement (see here). However, I can't seem to make it work with Room.

I keep getting this error:

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

(where the input to the DAO @Query-annotated method is called filterValues)

I have tried three different methods now:

  1. Passing the argument as a List<String>
  2. Passing the argument as a String[]
  3. And lastly passing the argument as simply a String, but formatted as (value_1, value_2, ..., value_n)

The last one in particular should work easily, as it will (or at least, it should) directly translate to SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n), which is the exact way you would manually write out the SELECT if you were just accessing the database directly.


回答1:


So as I was preparing to submit this, I double-checked a bunch of the stuff I had looked up previously and found the thing I had somehow missed and would have saved this question from being necessary.

As it turns out, both of these options:

  1. Passing the argument as a List<String>
  2. Passing the argument as a String[]

are viable (and you can replace String with any type the database can represent, such as char or int), you simply need to change the syntax in the @Query annotation from this:

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

to this:

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

Easy as pie, right?

Note that the third method above (passing the argument as simply a String, but formatted as (value_1, value_2, ..., value_n)) does not appear to be supported by Room, but that's probably not a bad thing, since that's the hard way.

Since I already had the whole thing typed out, I figured I would leave the question up in case other people are have as much difficulty finding this solution as I did and stumble upon this question.




回答2:


Hi you can use this query:

 @Query("SELECT * FROM user WHERE uid IN(:userIds)")
 public abstract List findByIds(int[] userIds);

or

 @Query("SELECT * FROM user WHERE uid IN(:userIds)")
 public abstract List findByIds(List<Integer> userIds);


来源:https://stackoverflow.com/questions/48406228/room-select-query-with-in-condition

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!