Android Room - Wählen Sie die Abfrage mit LIKE aus

102

Ich versuche, eine Abfrage durchzuführen, um alle Objekte zu durchsuchen, deren Namen Text enthalten:

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

Mitteilungen:

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

Ich versuche auch:

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

Mitteilungen:

Error:Unused parameter: arg0

Wie kann ich das beheben?

Denis Buzmakov
quelle

Antworten:

140

Sie sollten die %Zeichen in Ihre Eingabeabfrage einschließen - nicht in die Abfrage selbst.

Versuchen Sie dies zum Beispiel:

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

Dann sollte Ihr String searchWert so aussehen:

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

Darüber hinaus sollte der Name des Bindungsparameters mit dem Variablennamen übereinstimmen und nicht arg0wie folgt aussehen:

@Query("SELECT * FROM hamster WHERE name LIKE :search")
fun loadHamsters(search: String?): Flowable<List<Hamster>>
Cody Caughlan
quelle
4
Beachten Sie, dass es derzeit einen Fehler mit Parameternamen in Kotlins
Kirill Rakhman
@ KirillRakhman, aber diese Methode funktioniert immer noch gut ;-) stackoverflow.com/a/44448566/6674369
Andriy Antonov
@AndriyAntonov der Kotlin-Fehler wurde vor 9 Monaten behoben
Kirill Rakhman
304

Sie können einfach mithilfe der SQLite-Zeichenfolgenverkettung konkatieren.

@Query("SELECT * FROM hamster WHERE name LIKE '%' || :search || '%'")
fun loadHamsters(search: String?): Flowable<List<Hamster>>
Yigit
quelle
1
Arbeite auch mit Kotlin Bug: youtrack.jetbrains.com/issue/KT-17959
Andriy Antonov
7
Dieser Ansatz ist eigentlich das, wonach die Frage gestellt wurde. Obwohl die andere Antwort auch ziemlich gut ist.
Xarlymg89
Ich verstehe das, '%'aber kann jemand erklären, was ist '||'und warum?
Ali Kazi
15
||ist ein String-Verkettungsoperator. Stellen Sie es sich wie +in Java String vor.
Sanlok Lee
tolle Antwort. Vielen herzlichen Dank.
reza_khalafi
0

Room unterstützt nur den Namen bind parameter : name , um Verwechslungen zwischen den Methodenparametern und den Abfragebindungsparametern zu vermeiden.

Room bindet die Parameter der Methode automatisch in die Bindungsargumente. Dazu wird der Name der Parameter mit dem Namen der Bindungsargumente abgeglichen.

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