63 votes

Room - Sélectionnez la requête avec la condition IN?

Est-il possible d'utiliser SQLite de l' IN état de la Pièce?

Je suis en train de sélectionner une liste d'éléments de ma base de données où la valeur d'une certaine colonne (dans ce cas, un TEXT colonne) correspond à un ensemble de valeurs de filtre. C'est assez facile à faire en SQL et SQLite, par ma connaissance, juste en ajoutant un IN condition d' SELECT déclaration (voir ici). Cependant, je n'arrive pas à le faire fonctionner avec la Salle.

Je reçois cette erreur:

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

(où l'entrée de la DAO @Query-annoté méthode est appelée filterValues)

J'ai essayé trois méthodes différentes maintenant:

  1. En passant l'argument comme un List<String>
  2. En passant l'argument comme un String[]
  3. Et enfin en passant l'argument simplement comme l' String, mais formaté en (value_1, value_2, ..., value_n)

Le dernier, en particulier, devraient travailler facilement, comme il va (ou au moins, elle le devrait) de traduire directement à l' SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n), ce qui est exactement la manière que vous le feriez manuellement écrire l' SELECT si l'on vient d'accéder à la base de données directement.

116voto

VerumCH Points 795

Alors que je me préparais à soumettre la présente, j'ai vérifié un tas de trucs que j'avais regardé auparavant et a trouvé la chose que je n'avais pas et aurait sauvé cette question ne soit pas nécessaire.

Comme il s'avère, ces deux options:

  1. En passant l'argument comme un List<String>
  2. En passant l'argument comme un String[]

sont viables (et vous pouvez remplacer String avec n'importe quel type de la base de données peut représenter, comme char ou int), il vous suffit de changer la syntaxe de l' @Query d'annotation à partir de ceci:

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

pour cela:

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

Simple comme bonjour, à droite?

Notez que la troisième méthode ci-dessus (en passant l'argument simplement comme l' String, mais formaté en (value_1, value_2, ..., value_n)) ne semble pas être pris en charge par la Chambre, mais ce n'est probablement pas une mauvaise chose, car c'est à la dure.

Depuis j'ai déjà eu le tout tapé, je pensais, je laisse la question dans le cas où d'autres personnes ont autant de difficultés à trouver cette solution comme je l'ai fait et trébucher sur cette question.

44voto

Ahmad Aghazadeh Points 8690

Bonjour, vous pouvez utiliser cette requête:

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

ou

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X