Sala de Android: seleccione una consulta con LIKE

105

Estoy tratando de hacer una consulta para buscar todos los objetos cuyos nombres contienen texto:

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

Mensajes:

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

También estoy intentando:

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

Mensajes:

Error:Unused parameter: arg0

¿Cómo arreglar esto?

Denis Buzmakov
fuente

Respuestas:

142

Debe incluir los %caracteres en su consulta de entrada, no en la consulta en sí.

Por ejemplo, prueba esto:

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

Entonces su String searchvalor debería verse así:

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

Además, el nombre del parámetro de vinculación debe coincidir con el nombre de la variable, por lo que en lugar de arg0tener el siguiente aspecto:

@Query("SELECT * FROM hamster WHERE name LIKE :search")
fun loadHamsters(search: String?): Flowable<List<Hamster>>
Cody Caughlan
fuente
4
Tenga en cuenta que actualmente hay un error con los nombres de los parámetros en el procesamiento de anotaciones de Kotlin: youtrack.jetbrains.com/issue/KT-17959
Kirill Rakhman
@KirillRakhman pero este método aún funciona bien ;-) stackoverflow.com/a/44448566/6674369
Andriy Antonov
@AndriyAntonov el error de Kotlin se solucionó hace 9 meses
Kirill Rakhman
307

Puede simplemente concatizar usando la concatenación de cadenas SQLite.

@Query("SELECT * FROM hamster WHERE name LIKE '%' || :search || '%'")
fun loadHamsters(search: String?): Flowable<List<Hamster>>
yigit
fuente
1
funciona incluso con el error de kotlin: youtrack.jetbrains.com/issue/KT-17959
Andriy Antonov
7
Este enfoque es en realidad lo que pedía la pregunta. Aunque la otra respuesta también es bastante buena.
xarlymg89
Entiendo '%'pero, ¿alguien puede explicar qué es '||'y por qué?
Ali Kazi
15
||es un operador de concatenación de cadenas. Piense en ello como +en Java String.
Sanlok Lee
excelente respuesta. Muchísimas gracias.
reza_khalafi
0

Room solo admite el parámetro de vinculación con nombre: nombre para evitar cualquier confusión entre los parámetros del método y los parámetros de vinculación de la consulta.

Room vinculará automáticamente los parámetros del método en los argumentos de vinculación. Esto se hace haciendo coincidir el nombre de los parámetros con el nombre de los argumentos de enlace.

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