android - caracteristicas - investigacion sobre youtube pdf
Habitación-¿Seleccionar consulta con condición IN? (2)
¿Es posible utilizar la condición IN
de SQLite con Room?
Estoy tratando de seleccionar una lista de elementos de mi base de datos donde el valor de una determinada columna (en este caso una columna de TEXT
) coincida con cualquiera de un conjunto de valores de filtro. Eso es bastante fácil de hacer en SQL y SQLite, por lo que sé, solo agregando una condición IN
a su declaración SELECT
( vea aquí ). Sin embargo, parece que no puedo hacer que funcione con Room.
Sigo recibiendo este error:
Error:(70, 25) error: no viable alternative at input ''SELECT * FROM Table WHERE column IN :filterValues''
(donde la entrada al método DAO @Query
-annotated se llama filterValues
)
He intentado tres métodos diferentes ahora:
- Pasando el argumento como una
List<String>
- Pasando el argumento como una
String[]
- Y, por último, pasar el argumento como simplemente una
String
, pero formateado como(value_1, value_2, ..., value_n)
El último en particular debería funcionar fácilmente, ya que se traducirá (o, al menos, debería) directamente a SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n)
, que es la forma exacta en que lo haría manualmente. escriba el SELECT
si acaba de acceder directamente a la base de datos.
Así que cuando me estaba preparando para enviar esto, verifiqué un montón de cosas que había buscado anteriormente y encontré lo que de alguna manera me había pasado por alto y habría ahorrado esta pregunta de ser necesario.
Como resultado, ambas opciones:
- Pasando el argumento como una
List<String>
- Pasando el argumento como una
String[]
son viables (y puede reemplazar String
con cualquier tipo que la base de datos pueda representar, como char
o int
), simplemente necesita cambiar la sintaxis en la anotación @Query
partir de esto:
@Query("SELECT * FROM Table WHERE column IN :filterValues")
a esto:
@Query("SELECT * FROM Table WHERE column IN (:filterValues)")
Fácil como el pastel, ¿verdad?
Tenga en cuenta que el tercer método anterior (pasar el argumento simplemente como una String
, pero formateado como (value_1, value_2, ..., value_n)
) no parece ser compatible con Room, pero probablemente no sea algo malo, ya que esa es la manera difícil.
Como ya lo tenía todo escrito, pensé que dejaría la pregunta en caso de que otras personas tuvieran tantas dificultades para encontrar esta solución como yo y tropezara con esta pregunta.
Hola puedes usar esta consulta:
@Query("SELECT * FROM user WHERE uid IN(:userIds)")
public abstract List findByIds(int[] userIds);
o
@Query("SELECT * FROM user WHERE uid IN(:userIds)")
public abstract List findByIds(List<Integer> userIds);