2009-09-24 4 views
62

मैं एक खोज क्षेत्र को कार्यान्वित कर रहा हूं जहां उपयोगकर्ता दृश्य में प्रदर्शित वस्तुओं को फ़िल्टर करने के लिए स्ट्रिंग में टाइप कर सकता है। प्रदर्शित होने वाली प्रत्येक वस्तु में keywords से कई रिश्ते हैं, और मैं उनके कीवर्ड के आधार पर ऑब्जेक्ट्स को फ़िल्टर करने में सक्षम होना चाहता हूं। प्रत्येक कीवर्ड वस्तु एक name संपत्ति है, इसलिए मैं छानने कि इस तरह दिखता है करने के लिए एक NSPredicate सेट कर लेते हैं:कई रिश्तों पर एनएसपीडिकेट केस-असंवेदनशील मिलान

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS %@", self.searchString]; 

यह काम करता है, लेकिन समस्या यह है, केस-संवेदी है कि खोज है, इसलिए यदि कीवर्ड में पूंजी पत्र होता है लेकिन उपयोगकर्ता सभी लोअरकेस में टाइप करता है, कोई मिलान नहीं मिलता है। मैंने निम्नलिखित संशोधन की कोशिश की है:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS[c] %@", self.searchString]; 

लेकिन इससे मेल खाने की संवेदनशीलता में कोई फर्क नहीं पड़ता है। क्या इस मामले-असंवेदनशील मिलान को केवल एक सादे भविष्यवाणी का उपयोग करने का कोई तरीका है? या मुझे कीवर्ड वर्ग पर कुछ प्रकार के कस्टम एक्सेसर को लागू करने की आवश्यकता होगी, उदा। lowercaseName विधि लिखें और इसके बजाय खोज स्ट्रिंग के निचले संस्करण के विरुद्ध मिलान करें?

परिशिष्ट: आगे अन्वेषण करने के बाद, एक कस्टम एक्सेसर जोड़ने के वैकल्पिक हल NSPredicate के मैनुअल उपयोग के लिए ठीक काम करता है, लेकिन जब कोर डाटा है, जो केवल काम करता है जब कोर डाटा में परिभाषित विशेषताओं क्वेरी करने के साथ NSFetchRequest का उपयोग करने में बिल्कुल काम नहीं करता आदर्श।

उत्तर

79

अगर मैं तुम्हें सही ढंग से समझ, आप जब भी कोई भी कीवर्ड नाम खोज स्ट्रिंग से मेल खाता अपने विधेय सच होना चाहता हूँ। इसके लिए आपको किसी भी इस तरह कीवर्ड के साथ परीक्षण करने के लिए की जरूरत है:

[NSPredicate predicateWithFormat:@"ANY keywords.name CONTAINS[c] %@", ...]; 

इस कीवर्ड खोज और सच वापसी करता है, तो उन खोजशब्दों नाम के किसी भी अपने खोज स्ट्रिंग होगा।

+1

मुझे पता था कि मुझे एक तरह से लापता होना था। एक जादू की तरह काम करता है। धन्यवाद! –

42

मेरा मानना ​​है कि जवाब है:

[NSPredicate predicateWithFormat:@"keywords.name CONTAINS[cd] %@", self.searchString]; 

String comparisons are by default case and diacritic sensitive. You can modify an operator using the key characters c and d within square braces to specify case and diacritic insensitivity respectively, for example firstName BEGINSWITH[cd] $FIRST_NAME.

Predicate Format String Syntax

+0

यह अनिवार्य रूप से मूल प्रश्न में पोस्ट किए गए मेरे दूसरे प्रयास के समान ही है, केवल डायक्रिटिक ध्वज के अलावा अलग है। समस्या यह है कि यह काम नहीं करता है जब अभिव्यक्ति के बाएं हाथ की ओर एक साधारण स्ट्रिंग नहीं है। –

+1

मेरे लिए, [डी] विकल्प ने मुझे यह त्रुटि दी: 'अपरिचित अपवाद के कारण ऐप को समाप्त करना' अमान्य पूर्वानुमान विकल्प ', कारण:' NSDiacriticInsensitivePredicateOption स्ट्रिंग प्रकार ' – Zeb

+0

मुझे भी समर्थित नहीं है। मुझे एक ही त्रुटि मिली। –

12

आप पकड़ने की कोशिश कर रहा है, तो केवल नाम के बराबर होती है लेकिन असंवेदनशील मामले के साथ, मुझे लगता है कि यह सबसे अच्छा समाधान

[NSPredicate predicateWithFormat:@"ANY keywords.name LIKE[c] %@", ...]; 

तुम मुझे बहुत मदद की है। धन्यवाद दोस्तों!!!

मेरे मामले में मैंने किया था:

[NSPredicate predicateWithFormat:@"ANY name LIKE[c] %@", @"teste"]; 
+0

'LIKE' ग्लोब (? *) मिलान ऑपरेटर है। यह केवल तभी काम करेगा यदि आप '% @' के लिए पारित स्ट्रिंग एक ग्लोब पैटर्न है, क्योंकि भविष्यवाणी इसे एक के रूप में व्याख्या करेगी; यदि स्ट्रिंग एक ग्लोब पैटर्न नहीं है, तो इसे पास करने के लिए जहां एक ग्लोब की उम्मीद है, समस्याएं पैदा करेगी। यदि आप सख्त समानता चाहते हैं तो == का प्रयोग करें। –

+7

ओएच मैन !!!!!!!!!! यह भी काम करता है .. == [सी]। मैंने यह कोशिश नहीं की है! ग्लोब पेटथर क्या है, मैंने इसे गुगल किया लेकिन ... क्या यह नियमित अभिव्यक्ति है? – wal

+0

नहीं ग्लोब एक ही समय में एकाधिक फ़ाइल नामों से मेल खाने के लिए शैल में उपयोग किए जाने वाले पैटर्न हैं। –

1

तुम दोनों केस संवेदी और वाइल्डकार्ड चाहते हैं, इस का उपयोग करें:

NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(name like[c] '*%@*')",@"search"]]; 
+1

'एनएसपीडिकेट * predicate = [एनएसपी्रेडिकेट predicateWithFormat: @" (नाम [सी] '*% @ *') ", @" खोज "];' पर्याप्त है। – Zeb

2

आप कीवर्ड से मेल खाना चाहिए, लेकिन खोज केस किया जाना चाहिए संवेदनशील में आपको NSPredicate(format: "keywords.name =[c] %@", self.searchString)

LIKE स्ट्रिंग अक्षर पर काम नहीं करना चाहिए।