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:
List<String>
String[]
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.
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:
List<String>
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.
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);