Stanza Android: seleziona la query con MI PIACE


105

Sto cercando di fare una query per cercare tutti gli oggetti i cui nomi contengono testo:

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

Messaggi:

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

Inoltre sto provando:

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

Messaggi:

Error:Unused parameter: arg0

Come risolvere questo problema?

Risposte:


142

È necessario racchiudere i %caratteri nella query di input, non nella query stessa.

Ad esempio, prova questo:

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

Quindi il tuo String searchvalore dovrebbe essere simile a:

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

Inoltre, il nome del parametro di associazione dovrebbe corrispondere al nome della variabile, quindi piuttosto che arg0dovrebbe apparire come:

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

4
Si noti che attualmente esiste un bug con i nomi dei parametri nell'elaborazione delle annotazioni di Kotlin: youtrack.jetbrains.com/issue/KT-17959
Kirill

@KirillRakhman ma questo metodo funziona ancora bene ;-) stackoverflow.com/a/44448566/6674369
Andriy Antonov

@AndriyAntonov il bug di Kotlin è stato risolto 9 mesi fa
Kirill Rakhman

307

Puoi semplicemente concatenare usando la concatenazione di stringhe SQLite.

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

1
funziona anche con il bug di kotlin: youtrack.jetbrains.com/issue/KT-17959
Andriy Antonov

7
Questo approccio è in realtà ciò che la domanda stava chiedendo. Sebbene anche l'altra risposta sia abbastanza buona.
xarlymg89

Capisco '%'ma qualcuno può spiegare cos'è '||'e perché?
Ali Kazi

15
||è l'operatore di concatenazione di stringhe. Pensalo come +in Java String.
Sanlok Lee,

risposta formidabile. Grazie così tanto.
reza_khalafi

0

Room supporta solo il parametro bind denominato : nome per evitare qualsiasi confusione tra i parametri del metodo e quelli della query bind.

Room legherà automaticamente i parametri del metodo agli argomenti di bind. Questo viene fatto abbinando il nome dei parametri al nome degli argomenti di bind.

 @Query("SELECT * FROM user WHERE user_name LIKE :name AND last_name LIKE :last")
 public abstract List<User> findUsersByNameAndLastName(String name, String last);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.