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?

Denis Buzmakov
fonte

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>>
Cody Caughlan
fonte
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>>
yigit
fonte
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);
Swapnil
fonte