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.