Salle Android - Sélectionnez une requête avec LIKE

105

J'essaie de faire une requête pour rechercher tous les objets dont les noms contiennent 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'essaye aussi:

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

Messages:

Error:Unused parameter: arg0

Comment régler ceci?

Denis Buzmakov
la source

Réponses:

142

Vous devez inclure les %caractères 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 searchvaleur devrait ressembler à:

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

De plus, le nom du paramètre de liaison doit correspondre au nom de la variable, donc plutôt que arg0cela devrait ressembler à:

@Query("SELECT * FROM hamster WHERE name LIKE :search")
fun loadHamsters(search: String?): Flowable<List<Hamster>>
Cody Caughlan
la source
4
Notez qu'il existe actuellement un bug avec les noms de paramètres dans le traitement des annotations de Kotlin: youtrack.jetbrains.com/issue/KT-17959
Kirill Rakhman
@KirillRakhman mais cette méthode fonctionne toujours bien ;-) stackoverflow.com/a/44448566/6674369
Andriy Antonov
@AndriyAntonov le bug de Kotlin a été corrigé il y a 9 mois
Kirill Rakhman
307

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

@Query("SELECT * FROM hamster WHERE name LIKE '%' || :search || '%'")
fun loadHamsters(search: String?): Flowable<List<Hamster>>
yigit
la source
1
fonctionne même avec le bogue de kotlin: youtrack.jetbrains.com/issue/KT-17959
Andriy Antonov
7
Cette approche est en fait ce que la question demandait. Bien que l'autre réponse soit également très bonne.
xarlymg89
Je comprends '%'mais quelqu'un peut-il expliquer ce que c'est '||'et pourquoi?
Ali Kazi le
15
||est l'opérateur de concaténation de chaîne. Pensez-y comme +dans Java String.
Sanlok Lee
excellente réponse. Merci beaucoup.
reza_khalafi le
0

Room ne prend en charge que le paramètre de liaison nommé : nom pour éviter toute confusion entre les paramètres de méthode et les paramètres de liaison de requête.

Room liera automatiquement les paramètres de la méthode dans les arguments de liaison. 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);
Swapnil
la source