web-dev-qa-db-fra.com

Android Room - Sélection de la requête avec LIKE

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

Aussi j'essaye:

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

Messages:

Error:Unused parameter: arg0

Comment régler ceci?

64
Denis Buzmakov

Vous devez inclure les caractères % dans votre requête d'entrée - pas dans la requête elle-même.

Par exemple. essaye ça:

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

Ensuite, votre valeur String search devrait ressembler à ceci:

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

De plus, le nom du paramètre de liaison doit correspondre au nom de la variable. Ainsi, plutôt que arg0, il devrait ressembler à ceci:

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

Vous pouvez simplement concaténer à l'aide de la concaténation de chaînes SQLite.

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

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

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