2017-05-25 24 views
22

Próbuję złożyć zapytanie do wyszukiwania wszystkich obiektów, których nazwy zawierają tekst:Android Room - Wybierz zapytanie z LIKE

@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 

Również próbuję:

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

Wiadomości:

Error:Unused parameter: arg0 

Jak to naprawić?

Odpowiedz

27

Należy wpisać znaki % w zapytaniu wejściowym - nie w samym zapytaniu.

E.g. spróbuj tego:

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

Następnie swoją wartość String search powinna wyglądać następująco:

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

Ponadto, wiązanie nazwa parametru powinna być zgodna z nazwą zmiennej, więc zamiast arg0 powinno to wyglądać tak:

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

Działa! Dzięki! –

+2

Należy zauważyć, że obecnie występuje błąd z nazwami parametrów w przetwarzaniu adnotacji Kotlina: https://youtrack.jetbrains.com/issue/KT-17959 –

50

Możesz po prostu konkatować używając konkatenacji ciągów SQLite.

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