2010-01-06 11 views
8

मेरे पास एक ऐसी स्थिति है जहां मैं उपयोगकर्ता नाम कुंजी द्वारा अपने मूल डेटा स्टोर से ऑब्जेक्ट्स लेना चाहता हूं, लेकिन मैं तुलना केस-असंवेदनशील होना चाहता हूं।एक सरणी से तारों के लिए केस असंवेदनशील NSPredicate?

username IN $usernames 

मैं तो तार कि उपयोगकर्ता नाम मैं पता लगाना चाहते हैं की एक सरणी के साथ एक चर प्रतिस्थापन कार्य करें: विधेय मेरे पास यह है। यह काम करता है लेकिन केस-संवेदी है। मुझे ऐसा कुछ करना है, मुझे लगता है:

username IN[c] $usernames 

दुर्भाग्य से यह काम नहीं करता है। एक केस-संवेदनशील तरीके से स्ट्रिंग तुलना अभी भी होनी चाहिए। (मुझे असमर्थित क्वेरी होने के बारे में कोई त्रुटि नहीं मिली है।)

क्या इस भविष्य को लिखने का कोई अलग तरीका है, इसलिए यह जिस तरह से मुझे चाहिए या मैं बस कुछ स्पष्ट याद कर रहा हूं?

+0

क्या आप भविष्य के निर्माता या सीधे कोड में भविष्यवाणी कर रहे हैं? – Anurag

+0

यह डेटा मॉडल में संग्रहीत एक प्राप्त अनुरोध है। – Sean

उत्तर

9

SQL ऑपरेटर के खिलाफ एक fetch निष्पादित करते समय आईएन ऑपरेटर पर केस संशोधक को स्पष्ट रूप से अनदेखा किया जाता है। (आपने स्टोर के प्रकार को अपने प्रश्न से छोड़ा है।)

मैं प्रलेखन के खिलाफ एक बग दर्ज करने की अनुशंसा करता हूं ताकि इस सीमा/व्यवहार को दस्तावेज किया जा सके।

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

इस बीच, आपको डेटा मॉडल से अपने fetch अनुरोध को खींचना होगा और इसे प्रोग्रामिक रूप से बनाना होगा। आप एक यौगिक पूर्वानुमान बना सकते हैं या भविष्यवाणी कर सकते हैं कि आपके प्रत्येक मान के लिए एक केस असंवेदनशील समानता मैच (और परीक्षण करें कि यह आपकी प्रदर्शन आवश्यकताओं को पूरा करता है।)

ध्यान दें कि यदि आप 10.6 से पहले ओएस लक्ष्य का समर्थन कर रहे हैं तो केस संशोधक == समर्थित नहीं है, इस मामले में अभी तक एक और वैकल्पिक समाधान की आवश्यकता होगी।

+0

अपने अंतिम बिंदु के लिए, क्या आपका मतलब है == जब एक अनुमानित स्ट्रिंग के रूप में उपयोग किया जाता है? प्रोग्रामेटिक रूप से भविष्यवाणी करते समय यह अभी भी काम करता है? मैं 10.5 लक्ष्यीकरण कर रहा हूँ। – Sean

+1

10.5 पर परीक्षण के बाद, ऐसा लगता है कि यह काम नहीं करेगा। Dammit! ऐसा लगता है कि मेरा एकमात्र विकल्प एक अभिव्यक्ति बनाना है जैसे: "उपयोगकर्ता नाम शामिल है [सीडी] $ u और $ आप शामिल हैं [सीडी] उपयोगकर्ता नाम"। आह। – Sean

+0

और नहीं। यहां तक ​​कि दो कंटेन का उपयोग करना भी काम नहीं करेगा क्योंकि मेरी समग्र अभिव्यक्ति अन्य भविष्यवाणियों का समूह है या ऐसा लगता है कि मेरे पास एक सेट या सेट नहीं हो सकता है जिसमें भविष्यवाणी है और भविष्यवाणी है। ब्ला। इस बारे में सब गलत होने के बाद, मैंने LIKE [cd] का उपयोग करने के लिए स्विच किया और * और से बच निकला? मेरे इनपुट स्ट्रिंग से अक्षर। एक जादू की तरह काम करता है। भविष्य में हैंडलिंग में सीमाओं की एक परेशानीजनक संख्या प्रतीत होती है ... – Sean

1

आप ANY $usernames LIKE[c] username जैसे कुछ कोशिश कर सकते हैं। मैंने कुछ ऐसा ही किया है, जहां परिवर्तनीय प्रतिस्थापन के बजाय, मेरे पास "person.name" जैसे महत्वपूर्ण पथ हैं, और यह मेरे लिए काम करता है। सुनिश्चित नहीं है कि यह एक महत्वपूर्ण पथ के बजाय एक चर के साथ किसी भी अलग तरीके से काम करता है, लेकिन यह एक शॉट के लायक है।

+0

दुर्भाग्यवश, वह अनुमान SQLite स्टोर के साथ काम नहीं करेगा। (अनुक्रमित एसक्यूएल पीढ़ी।) ऐसी परिस्थितियों में जहां यह काम करता है, यह सुनिश्चित करने के लिए सावधानी बरतें कि स्ट्रिंग पाप $ usernames का शाब्दिक है जैसे वाइल्डकार्ड वर्ण बच निकले हैं। –

1

यहां एक और कामकाज है, लेकिन आपको एमओएम बदलने की आवश्यकता है।

उपयोगकर्ता नाम एक पूर्ण उड़ा इकाई बनाएं। उपयोगकर्ता नाम और जो भी आपकी अन्य इकाई के बीच व्यस्त संबंध बनाएं।

लाने का अनुरोध के लिए

अब, के रूप में "उपयोगकर्ता नाम" तो यह विधेय (एक "नाम" संपत्ति और "जनक" संपत्ति मानकर) चलाने इकाई सेट:

[NSPredicate predicateWithFormat:"(name like[c] %@) && (parent == %@)", theUserName, theParentObject] 

यह overkill हो सकता है लेकिन अनुमति देगा आप वांछित के रूप में अपनी खोज चलाने के लिए।

-1

हालांकि इस सवाल कई वर्ष मैं सिर्फ एक ही समस्या पर ठोकर खाई और इस तरह इसे हल है:

NSArray *values = @[@"FOO", @"bar" ,@"lorem"]; 
NSString *predicate; 

predicate = @"value LIKE[cd] '"; 
predicate = [predicate stringByAppendingString: 
      [values componentsJoinedByString: 
       @"' OR value LIKE[cd] '"]]; 
predicate = [predicate stringByAppendingString:@"'"]; 

NSLog(@"%@", predicate); 
// Output: 
// value LIKE[cd] 'FOO' OR value LIKE[cd] 'bar' OR value LIKE[cd] 'lorem' 

यह मान सूची में से एक स्थिर विधेय अभिव्यक्ति पैदा करता है। शायद यह किसी के लिए उपयोगी होगा।

अद्यतन 2:

वास्तव में ऐसा लगता है नीचे अद्यतन समाधान SQLite साथ काम नहीं करता और पैदा करता है एक

'NSInvalidArgumentException', 
reason: 'unimplemented SQL generation for predicate : ... (bad LHS)' 

मैं सरणी/dict/सेट comparisions के लिए लगता है और IN केवल चाबियाँ अनुमति देखते हैं ऑपरेटर के बाईं तरफ।

अद्यतन:

NSPredicate *predicate = 
    [NSPredicate predicateWithFormat: 
    @"lowercase(value) IN %@", values]; 

यह की लोअरकेस प्रतिनिधित्व प्राप्त करने के लिए समारोह अभिव्यक्ति lowercase: उपयोग करता है:

भाव और विधेय मैं एक और aproach पाया पर कुछ शोध करने के बाद, कि काफी अच्छी तरह से काम करने लगता है मूल्य। यह सुनिश्चित करने के लिए बाकी है कि values की सभी प्रविष्टियां लोअरकेस हैं और आप केस असंवेदनशील IN अभिव्यक्तियों का उपयोग करने में सक्षम होंगे।

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