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?

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>>

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>>

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.