Android Room - LIKE के साथ क्वेरी का चयन करें


105

मैं उन सभी वस्तुओं को खोजने के लिए एक क्वेरी बनाने की कोशिश कर रहा हूं जिनके नाम में पाठ है:

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

संदेश:

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

इसके अलावा मैं कोशिश कर रहा हूँ:

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

संदेश:

Error:Unused parameter: arg0

इसे कैसे ठीक करें?

जवाबों:


142

आपको %अपने इनपुट क्वेरी में वर्णों को संलग्न करना चाहिए - क्वेरी में ही नहीं।

जैसे यह प्रयास करें:

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

तब आपका String searchमूल्य इस तरह दिखना चाहिए:

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

इसके अलावा, बाइंडिंग पैरामीटर नाम चर नाम से मेल खाना चाहिए, इसलिए इसके बजाय ऐसा arg0दिखना चाहिए:

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

4
नोट वर्तमान में Kotlin का एनोटेशन प्रसंस्करण में पैरामीटर नाम के साथ एक बग है कि वहाँ: youtrack.jetbrains.com/issue/KT-17959
किरिल Rakhman

@KirillRakhman लेकिन यह तरीका अभी भी ठीक काम करता है ;-) stackoverflow.com/a/44448566/6674369
Andriy Antonov

@AndriyAntonov कोटलीन बग को 9 महीने पहले तय किया गया था
किरिल

307

आप बस SQLite स्ट्रिंग संघनन का उपयोग कर कॉनकैट कर सकते हैं।

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

1
कोटलिन बग के साथ भी काम करें: youtrack.jetbrains.com/issue/KT-17959
एंड्री एंटोनोव

7
यह दृष्टिकोण वास्तव में वही है जो प्रश्न पूछ रहा था। हालांकि अन्य उत्तर भी काफी अच्छा है।
xarlymg89

मैं समझता हूं '%'लेकिन क्या कोई समझा सकता है कि क्या '||'और क्यों है?
अली काजी

15
||स्ट्रिंग समवर्ती ऑपरेटर है। +जावा स्ट्रिंग के रूप में इसके बारे में सोचो ।
सांवलोक ली

भयानक जवाब। आपका बहुत - बहुत धन्यवाद।
reza_khalafi

0

कक्ष केवल बाइंड पैरामीटर नाम का समर्थन करता है : विधि मापदंडों और क्वेरी बाइंड मापदंडों के बीच किसी भी भ्रम से बचने के लिए नाम

कक्ष स्वचालित रूप से विधि के मापदंडों को बाइंड तर्क में बांध देगा। यह मापदंडों के नाम को बाइंड तर्कों के नाम से मिलान करके किया जाता है।

 @Query("SELECT * FROM user WHERE user_name LIKE :name AND last_name LIKE :last")
 public abstract List<User> findUsersByNameAndLastName(String name, String last);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.