web-dev-qa-db-fra.com

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

Est-il possible d'utiliser la condition IN de SQLite avec Room?

J'essaie de sélectionner une liste d'éléments dans ma base de données où la valeur d'une colonne donnée (dans ce cas une colonne TEXT) correspond à l'une des valeurs d'un filtre. À ma connaissance, cela se fait assez facilement en SQL et SQLite, simplement en ajoutant une condition IN à votre instruction SELECT ( voir ici ). Cependant, je n'arrive pas à le faire fonctionner avec Room.

Je continue à avoir cette erreur:

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

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

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

  1. Passer l'argument en tant que List<String>
  2. Passer l'argument en tant que String[]
  3. Et enfin, passer l'argument comme un simple String, mais au format (value_1, value_2, ..., value_n)

Le dernier en particulier devrait fonctionner facilement, car il traduira (ou du moins, il devrait) traduire directement en SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n), qui correspond exactement à la manière dont vous écririez manuellement le SELECT si vous le souhaitez. venaient juste d'accéder à la base de données directement.

32
VerumCH

Alors, alors que je m'apprêtais à soumettre cela, j'ai vérifié deux fois une série de choses que j'avais déjà consultées et j'ai trouvé la chose que j'avais ratée d'une manière ou d'une autre et j'aurais évité que cette question soit nécessaire.

Il se trouve que ces deux options:

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

sont viables (et vous pouvez remplacer String par tout type que la base de données peut représenter, tel que char ou int), il vous suffit de modifier la syntaxe dans le fichier @Query annotation à partir de ceci:

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

pour ça:

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

Facile comme bonjour, non?

Notez que la troisième méthode ci-dessus (en passant l’argument comme un simple String, mais au format (value_1, value_2, ..., value_n)) ne semble pas être pris en charge par Room, mais ce n’est probablement pas une mauvaise chose, car c’est la voie la plus difficile.

Comme tout était déjà dactylographié, je me suis dit que je laisserais la question posée au cas où d’autres personnes auraient autant de difficulté à trouver cette solution que moi et que je trébuche sur cette question.

66
VerumCH

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);
20
Ahmad Aghazadeh