2012-05-08 15 views
11

का उपयोग कर NSDictionary ऑब्जेक्ट्स के एनएसएआरएआर फ़िल्टरिंग में मेरे पास NSDictionary ऑब्जेक्ट्स का एनएसएआरआरई है। मैं NSPredicate का उपयोग कर शब्दकोशों की कुंजी के आधार पर सरणी फ़िल्टर करना चाहता हूं। मैं कुछ इस तरह कर रहे हैं:NSPredicate

NSString *predicateString = [NSString stringWithFormat:@"%@ == '%@'", key, value]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; 
NSArray *filteredResults = [allResultsArray filteredArrayUsingPredicate:predicate]; 

यह ठीक काम करता है अगर वे में पारित कुंजी एक शब्द है: रंग, नाम, आयु। लेकिन यह काम नहीं करता है अगर कुंजी बहु शब्द है, जैसे: व्यक्ति आयु, व्यक्ति का नाम।

मूल रूप से, किसी भी महत्वपूर्ण यह है कि एक स्थान शामिल हैं, यह काम नहीं करता। मैंने स्ट्रिंग में कुंजी के चारों ओर सिंगल कोट्स डालने का प्रयास किया है, जैसे कि वे मूल्य के पक्ष में किए जाते हैं लेकिन यह काम नहीं करता है। डबल कोट्स भी कोशिश की, लेकिन इसका कोई फायदा नहीं हुआ।

कृपया इस पर सलाह दें। अग्रिम में धन्यवाद।

+2

कोशिश% कश्मीर - यह कोर डेटा में काम ठीक है – user170317

+0

[NSPredicate प्रारूप स्ट्रिंग काम नहीं करता है] (के संभावित डुप्लिकेट http://stackoverflow.com/questions/12413929/nspredicate-format -स्ट्रिंग-काम नहीं करता) – Monolo

उत्तर

16

गतिशील कुंजी का उपयोग करते समय, आपको %@ के बजाय %K टोकन का उपयोग करना चाहिए। आप मूल्य टोकन के चारों ओर उद्धरण भी नहीं चाहते हैं। वे value के बजाय शाब्दिक स्ट्रिंग @"%@" के विरुद्ध समानता के लिए परीक्षण करने का अनुमान लगाएंगे।

NSString *predicateString = [NSString stringWithFormat:@"%K == %@", key, value]; 

यह Predicate Format String Syntax guide में प्रलेखित है।


संपादित करें: Anum अमीन बताते हैं के रूप में, +[NSString stringWithFormat:] विधेय प्रारूपों को संभाल नहीं करता है। आप इसके बजाय [NSPredicate predicateWithFormat:@"%K == %@", key, value] चाहते हैं।

+5

एनएसएसटींग सही ढंग से% K को प्रतिस्थापित नहीं करेगा। किसी को '[NSPredicate predicateWithFormat:] 'का उपयोग करना चाहिए। नीचे मेरा जवाब देखें। – NightFury

+0

@AnumAmin: आप बिल्कुल सही हैं। मुझे लगता है कि यह ताजा बनाने के बजाय बिट्टू के कोड को "ठीक करने" की कोशिश करने के लिए मुझे मिलता है। मुझे आश्चर्य है कि उसने मेरा जवाब भी स्वीकार कर लिया है। –

+0

मैं पहले से ही NSPredicate predicateWithFormat का उपयोग कर रहा था: इसलिए, एनएसएसटींग बनाने के लिए एक अलग कथन के बजाय उस कथन में इसे करना आसान था। मुझे इसे एक टिप्पणी में स्पष्ट करना चाहिए था लेकिन अनम ने इसे अच्छी तरह से किया :) – Bittu

23

मेरे लिए, केविन के जवाब काम नहीं किया। मैं प्रयोग किया है:

NSPredicate *predicateString = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", keySelected, text];//keySelected is NSString itself 
     NSLog(@"predicate %@",predicateString); 
     filteredArray = [NSMutableArray arrayWithArray:[YourArrayNeedToFilter filteredArrayUsingPredicate:predicateString]]; 
+0

घर पर खेलने वाले लोगों के लिए, वैकल्पिक '[सीडी]' आपको दोनों मामले- और diacritic-असंवेदनशीलता देता है। – smacdonald

संबंधित मुद्दे