Android Room - Pilih kueri dengan LIKE

105

Saya mencoba membuat kueri untuk mencari semua objek yang namanya berisi teks:

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

Pesan:

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

Juga saya mencoba:

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

Pesan:

Error:Unused parameter: arg0

Bagaimana cara mengatasinya?

Denis Buzmakov
sumber

Jawaban:

143

Anda harus memasukkan %karakter dalam kueri masukan Anda - bukan dalam kueri itu sendiri.

Misalnya coba ini:

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

Maka String searchnilai Anda akan terlihat seperti:

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

Selain itu, nama parameter binding harus cocok dengan nama variabel, jadi daripada arg0harus terlihat seperti:

@Query("SELECT * FROM hamster WHERE name LIKE :search")
fun loadHamsters(search: String?): Flowable<List<Hamster>>
Cody Caughlan
sumber
4
Perhatikan bahwa saat ini ada bug dengan nama parameter dalam pemrosesan anotasi Kotlin: youtrack.jetbrains.com/issue/KT-17959
Kirill Rakhman
@KirillRakhman tetapi metode ini masih berfungsi dengan baik ;-) stackoverflow.com/a/44448566/6674369
Andriy Antonov
@AndriyAntonov bug Kotlin diperbaiki 9 bulan yang lalu
Kirill Rakhman
310

Anda bisa menggabungkannya menggunakan penggabungan string SQLite.

@Query("SELECT * FROM hamster WHERE name LIKE '%' || :search || '%'")
fun loadHamsters(search: String?): Flowable<List<Hamster>>
yigit
sumber
1
bekerja bahkan dengan bug kotlin: youtrack.jetbrains.com/issue/KT-17959
Andriy Antonov
7
Pendekatan ini sebenarnya yang ditanyakan oleh pertanyaan itu. Meski jawaban lainnya cukup bagus juga.
xarlymg89
Saya mengerti '%'tetapi dapatkah seseorang menjelaskan apa itu '||'dan mengapa?
Ali Kazi
15
||adalah operator rangkaian string. Anggap saja seperti +di Java String.
Sanlok Lee
jawaban yang bagus. Terima kasih banyak.
reza_khalafi
0

Room hanya mendukung parameter binding bernama : name untuk menghindari kebingungan antara parameter metode dan parameter bind kueri.

Room secara otomatis akan mengikat parameter metode ke dalam argumen bind. Ini dilakukan dengan mencocokkan nama parameter dengan nama argumen bind.

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