Sala Android - Selecione a consulta com LIKE


105

Estou tentando fazer uma consulta para pesquisar todos os objetos cujos nomes contêm texto:

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

Mensagens:

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

Também estou tentando:

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

Mensagens:

Error:Unused parameter: arg0

Como consertar isto?

Respostas:


142

Você deve incluir os %caracteres em sua consulta de entrada - não na própria consulta.

Por exemplo, tente isto:

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

Então, seu String searchvalor deve ser semelhante a:

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

Além disso, o nome do parâmetro de ligação deve corresponder ao nome da variável, portanto, em vez de arg0ter a seguinte aparência:

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

4
Observe que atualmente há um bug com nomes de parâmetro no processamento de anotação do Kotlin: youtrack.jetbrains.com/issue/KT-17959
Kirill Rakhman

@KirillRakhman, mas este método ainda funciona bem ;-) stackoverflow.com/a/44448566/6674369
Andriy Antonov

@AndriyAntonov o bug do Kotlin foi corrigido há 9 meses
Kirill Rakhman

307

Você pode apenas concatenar usando a concatenação de string SQLite.

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

1
trabalhar mesmo com o bug do kotlin: youtrack.jetbrains.com/issue/KT-17959
Andriy Antonov

7
Essa abordagem é realmente o que a pergunta estava pedindo. Embora a outra resposta também seja muito boa.
xarlymg89

Eu entendo o '%'mas alguém pode explicar o que é '||'e por quê?
Ali Kazi

15
||é um operador de concatenação de string. Pense nisso como +em Java String.
Sanlok Lee de

ótima resposta. Muito obrigado
reza_khalafi

0

O Room só oferece suporte a parâmetro de vinculação nomeado : nome para evitar qualquer confusão entre os parâmetros de método e os parâmetros de vinculação de consulta.

O Room vinculará automaticamente os parâmetros do método aos argumentos de vinculação. Isso é feito combinando o nome dos parâmetros com o nome dos argumentos de ligação.

 @Query("SELECT * FROM user WHERE user_name LIKE :name AND last_name LIKE :last")
 public abstract List<User> findUsersByNameAndLastName(String name, String last);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.