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?

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

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

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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.