2015-06-30 14 views
5

मुझे कोड की इन पंक्तियों के साथ कोई समस्या नहीं दिखाई दे रही है। यह पार्स क्यों नहीं कर सकता?प्रारूप स्ट्रिंग को पार्स करने में असमर्थ NSPredicate

[NSPredicate predicateWithFormat:@"(username CONTAINS[cd] %[email protected]) || " 
            "(userId CONTAINS[cd] %[email protected]) || " 
            "(firstname CONTAINS[cd] %[email protected]) || " 
            "(lastname CONTAINS[cd] %[email protected])", searchString]" 

लॉग या तो मदद नहीं करता है।

न आया हुआ अपवाद 'NSInvalidArgumentException', कारण की वजह से उनका समापन एप्लिकेशन: 'प्रारूप स्ट्रिंग पार्स करने में असमर्थ "(उपयोगकर्ता नाम शामिल हैं [सीडी]% 1 $ @) || (userId शामिल हैं [सीडी]% 1 $ @) || (firstname शामिल हैं [सीडी]% 1 $ @) || (उपनाम शामिल हैं [सीडी]% 1 $ @) " '

संपादित करें 1:

ठीक है, ऐसा लगता है predicateWithFormat की तरह "% 1 $ @" समझ में नहीं आता है। मैं इसे

[... predicateWithFormat:[NSString stringWithFormat:...]] // (same format as above) 

पर स्विच कर दिया। लेकिन, अगले समस्या है:

self.filteredUserList = [self.userList filteredArrayUsingPredicate:predicate]; 

न आया हुआ अपवाद 'NSUnknownKeyException', कारण की वजह से एप्लिकेशन समाप्त: '[valueForUndefinedKey:]: इकाई उपयोगकर्ता कुंजी के लिए नहीं कुंजी मान कोडिंग अनुरूप है " ए"।'

"ए" खोजशब्द टेक्स्ट में दर्ज किया गया कीवर्ड है। WUT?

मैं डिबग कंसोल में विधेय बाहर मुद्रित, कुछ भी गलत नहीं दिखाई देता है:

username CONTAINS[cd] a OR userId CONTAINS[cd] a OR firstname CONTAINS[cd] a OR lastname CONTAINS[cd] a 

संपादित करें 2:

ठीक है, यह सुपर बदसूरत कोड के साथ हल समस्या:

[NSPredicate predicateWithFormat:@"(username CONTAINS[cd] %@) || " 
            "(userId CONTAINS[cd] %@) || " 
            "(firstname CONTAINS[cd] %@) || " 
            "(lastname CONTAINS[cd] %@)", searchString, searchString, searchString, searchString]; 

क्या होगा अगर मैं भविष्य में खोज क्षेत्र का विस्तार करना चाहता हूं? मुझे और पैरामीटर जोड़ना है? अधिक ", सर्चस्ट्रिंग, सर्चस्ट्रिंग, सर्चस्ट्रिंग"?

ईवान और Bannings के लिए धन्यवाद हल मेरे सवाल का 2 विकल्प दे रही है। मैंने दोनों का परीक्षण किया, और उन्होंने एक आकर्षण झूठ बोला। क्या कोई उन दोनों के बीच अलग-अलग समझा सकता है, और किस मामले में मैं किस विकल्प का उपयोग करूँ?

** नोट **

Bannings 'जवाब, ठीक है जब तक मेरी खोज स्ट्रिंग एक भी बोली ' फिर ऐप दुर्घटना में शामिल है। तो मुझे लगता है कि ईवान का उपयोग बेहतर है।

उत्तर

7

लागू करने की आवश्यकता हर चर के लिए स्ट्रिंग जोड़ने की जरूरत:

[[NSPredicate predicateWithFormat:@"(username CONTAINS[cd] $str) || ..."] predicateWithSubstitutionVariables:@{@"str": searchString}]; 
+0

सही काम करता है! मुझे इसकी ही आवश्यकता थी। धन्यवाद – Eddie

0

आप, यदि 5% का उपयोग @ आप या तो एक ही searchString मूल्य या आप यह कर सकते हैं एक और मूल्य है कि% के लिए भरने @

[NSPredicate predicateWithFormat:@"(username CONTAINS[cd] %[email protected]) || 
(userId CONTAINS[cd] %[email protected]) || (firstname CONTAINS[cd] %[email protected]) || 
(lastname CONTAINS[cd] %[email protected])", searchString1,searchString2,searchString3,searchString4] 
+0

मैं थोड़े है कि पता है। क्या कोई रास्ता है? चूंकि मेरी सभी खोज स्ट्रिंग एक ही मान है ... – Eddie

+0

http://stackoverflow.com/questions/7536750/nspredicate-with-multiple-comparisons-for-one-query-string इसे जांचें ... – eddwinpaz

+0

मैं नहीं करता यौगिक predicate का उपयोग करना चाहते हैं, क्योंकि मेरी भविष्यवाणी बहुत जटिल नहीं है। – Eddie

3

कोशिश परिवर्तन %[email protected]'%[email protected]' रहे हैं:

NSString *formatString = [NSString stringWithFormat:@"(username CONTAINS[cd] '%[email protected]') || (userId CONTAINS[cd] '%[email protected]') || (firstname CONTAINS[cd] '%[email protected]') || (lastname CONTAINS[cd] '%[email protected]')", searchString]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:formatString]; 
+0

ए राइट! यह भी काम करता है। लेकिन मैंने अभी ईवान के जवाब को स्वीकार कर लिया। बहुत अफसोस। – Eddie

+0

मेरे लिए सबसे अच्छा जवाब। – Claudio

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