165 votes

Android Room - Sélectionner une requête avec LIKE

J'essaie de faire une requête pour rechercher tous les objets dont le nom contient du texte :

@Query("SELECT * FROM hamster WHERE name LIKE %:arg0%")
fun loadHamsters(search: String?): Flowable<List<Hamster>>

Messages :

Error:no viable alternative at input 'SELECT * FROM hamster WHERE name LIKE %'
Error:There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (near "%": syntax error)
Error:Unused parameter: arg0

J'essaie aussi :

@Query("SELECT * FROM hamster WHERE name LIKE '%:arg0%'")
fun loadHamsters(search: String?): Flowable<List<Hamster>>

Messages :

Error:Unused parameter: arg0

Comment résoudre ce problème ?

460voto

yigit Points 634

Vous pouvez simplement concaténer en utilisant la concaténation de chaînes de SQLite.

@Query("SELECT * FROM hamster WHERE name LIKE '%' || :search || '%'")
fun loadHamsters(search: String?): Flowable<List<Hamster>>

1 votes

Fonctionne même avec le bug de kotlin : youtrack.jetbrains.com/issue/KT-17959

11 votes

Cette approche est en fait ce que la question demandait. Bien que l'autre réponse soit également très bonne.

3 votes

Je comprends que '%' mais quelqu'un peut-il expliquer ce qu'est '||' et pourquoi ?

199voto

Cody Caughlan Points 18780

Vous devez joindre le % dans votre requête d'entrée - pas dans la requête elle-même.

Par exemple, essayez ceci :

@Query("SELECT * FROM hamster WHERE name LIKE :arg0")
fun loadHamsters(search: String?): Flowable<List<Hamster>>

Alors votre String search devrait ressembler à une valeur :

search = "%fido%";
loadHamsters(search);

En outre, le nom du paramètre de liaison doit correspondre au nom de la variable, donc plutôt que de arg0 ça devrait ressembler à ça :

@Query("SELECT * FROM hamster WHERE name LIKE :search")
fun loadHamsters(search: String?): Flowable<List<Hamster>>

5 votes

Notez qu'il y a actuellement un bogue avec les noms de paramètres dans le traitement des annotations de Kotlin : youtrack.jetbrains.com/issue/KT-17959

0 votes

@KirillRakhman mais cette méthode fonctionne toujours bien ;-) stackoverflow.com/a/44448566/6674369

0 votes

@AndriyAntonov le bug de Kotlin a été corrigé il y a 9 mois.

44voto

Umesh Yadav Points 27

Quelques exemples de LIKE Mots clés utilisés dans dao avec la base de données des chambres.

  1. Commencez par Recherche_Quête

    @Query("SELECT * FROM hamster WHERE name LIKE :search_query || '%'")
     fun loadHamsters(search_query: String?): Flowable<List<Hamster>>
  2. Finir par Recherche_Quête

    @Query("SELECT * FROM hamster WHERE name LIKE '%' || :search_query ")
    fun loadHamsters(search_query: String?): Flowable<List<Hamster>>
  3. Obtenez tous ceux qui ont Recherche_Quête

    @Query("SELECT * FROM hamster WHERE name LIKE '%' || :search_query || '%'")
    fun loadHamsters(search_query: String?): Flowable<List<Hamster>>
  4. Utilisez l'option NOT LIKE For sauf pour les données qui ont Recherche_Quête

    @Query("SELECT * FROM hamster WHERE name NOT LIKE '%' || :search_query || '%'")
    fun loadHamsters(search_query: String?): Flowable<List<Hamster>>

1voto

Swapnil Points 306

Room ne prend en charge que les paramètres de liaison nommés :nom afin d'éviter toute confusion entre les paramètres de la méthode et les paramètres de liaison de la requête.

Room va automatiquement lier les paramètres de la méthode dans les arguments bind. Cela se fait en faisant correspondre le nom des paramètres au nom des arguments de liaison.

 @Query("SELECT * FROM user WHERE user_name LIKE :name AND last_name LIKE :last")
 public abstract List<User> findUsersByNameAndLastName(String name, String last);

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