Android Room - Wybierz zapytanie z LIKE

105

Próbuję wykonać zapytanie, aby przeszukać wszystkie obiekty, których nazwy zawierają tekst:

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

Wiadomości:

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

Próbuję też:

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

Wiadomości:

Error:Unused parameter: arg0

Jak to naprawić?

Denis Buzmakov
źródło

Odpowiedzi:

143

%Znaki należy umieścić w zapytaniu wejściowym, a nie w samym zapytaniu.

Na przykład spróbuj tego:

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

Wtedy twoja String searchwartość powinna wyglądać następująco:

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

Ponadto nazwa parametru powiązania powinna pasować do nazwy zmiennej, więc zamiast arg0powinna wyglądać tak:

@Query("SELECT * FROM hamster WHERE name LIKE :search")
fun loadHamsters(search: String?): Flowable<List<Hamster>>
Cody Caughlan
źródło
4
Zauważ, że obecnie występuje błąd z nazwami parametrów w przetwarzaniu adnotacji Kotlina: youtrack.jetbrains.com/issue/KT-17959
Kirill Rakhman
@KirillRakhman, ale ta metoda nadal działa dobrze ;-) stackoverflow.com/a/44448566/6674369
Andriy Antonov
@AndriyAntonov błąd Kotlina został naprawiony 9 miesięcy temu
Kirill Rakhman
310

Możesz po prostu połączyć za pomocą konkatenacji ciągów SQLite.

@Query("SELECT * FROM hamster WHERE name LIKE '%' || :search || '%'")
fun loadHamsters(search: String?): Flowable<List<Hamster>>
yigit
źródło
1
działa nawet z błędem kotlin: youtrack.jetbrains.com/issue/KT-17959
Andriy Antonov
7
To podejście jest właściwie tym, o co chodziło w pytaniu. Chociaż druga odpowiedź też jest całkiem dobra.
xarlymg89
Rozumiem, '%'ale czy ktoś może wyjaśnić, co to jest '||'i dlaczego?
Ali Kazi
15
||jest operatorem łączenia ciągów. Pomyśl o tym jak o +Java String.
Sanlok Lee,
świetna odpowiedź. Dziękuje Ci bardzo bardzo mocno.
reza_khalafi
0

Pokój obsługuje tylko nazwany parametr wiązania : nazwa, aby uniknąć nieporozumień między parametrami metody a parametrami wiązania zapytania.

Room automatycznie połączy parametry metody z argumentami bind. Odbywa się to poprzez dopasowanie nazwy parametrów do nazwy argumentów wiązania.

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