Android Odası - LIKE ile sorgu seçin


108

Adları metin içeren tüm nesneleri aramak için bir sorgu yapmaya çalışıyorum:

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

Mesajlar:

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

Ayrıca deniyorum:

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

Mesajlar:

Error:Unused parameter: arg0

Bunu nasıl düzeltebilirim?

Yanıtlar:


151

%Karakterleri, sorgunun kendisine değil, giriş sorgunuza eklemelisiniz .

Örneğin şunu deneyin:

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

O zaman String searchdeğeriniz şöyle görünmelidir:

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

Ayrıca, bağlama parametresi adı, aşağıdaki arg0gibi görünmesi yerine değişken adıyla eşleşmelidir :

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


@KirillRakhman ama bu yöntem hala iyi çalışıyor ;-) stackoverflow.com/a/44448566/6674369
Andriy Antonov

@AndriyAntonov Kotlin hatası 9 ay önce düzeltildi
Kirill Rakhman

329

SQLite dize birleştirme kullanarak sadece birleştirebilirsiniz.

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

1
kotlin hatasıyla bile çalışın: youtrack.jetbrains.com/issue/KT-17959
Andriy Antonov

7
Bu yaklaşım aslında sorunun sorduğu şeydi. Diğer cevap da oldukça iyi.
xarlymg89

Anlıyorum '%'ama birisi neyin '||'neden olduğunu açıklayabilir mi?
Ali Kazi

17
||dize bitiştirme operatörüdür. +Java String'de olduğu gibi düşünün .
Sanlok Lee

müthiş cevap. Çok çok teşekkür ederim.
reza_khalafi

0

Oda , yöntem parametreleri ve sorgu bağlama parametreleri arasında herhangi bir karışıklığı önlemek için yalnızca adlandırılmış bağlama parametresi : adı destekler .

Room, yöntemin parametrelerini otomatik olarak bağlama argümanlarına bağlayacaktır. Bu, parametrelerin adını bağ argümanlarının adıyla eşleştirerek yapılır.

 @Query("SELECT * FROM user WHERE user_name LIKE :name AND last_name LIKE :last")
 public abstract List<User> findUsersByNameAndLastName(String name, String last);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.