2011-05-31 15 views
21

में मैं कोर डेटा से ऑब्जेक्ट्स लाने की कोशिश कर रहा हूं जो किसी दिए गए सेट में नहीं हैं, लेकिन मैं इसे काम करने में सक्षम नहीं हूं।कोर डेटा से वस्तुओं को लाने के लिए सेट

उदाहरण के लिए, मान लें कि हमारे पास उपयोगकर्ता नाम की मूल डेटा इकाई है, जिसमें उपयोगकर्ता नाम, परिवार नाम, दिए गए नाम और सक्रिय जैसे कुछ गुण हैं। उपयोगकर्ता नाम का एक सेट का प्रतिनिधित्व तार की एक सरणी को देखते हुए, हम आसानी से सभी उपयोगकर्ताओं उपयोगकर्ता नाम की उस सूची के लिए इसी लाने कर सकते हैं:

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" 
              inManagedObjectContext:moc]; 
[request setEntity:entity]; 

NSArray *userNames = [NSArray arrayWithObjects:@"user1", @"user2", @"user3", nil]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName IN %@", userNames]; 
[request setPredicate:predicate]; 
NSArray *users = [moc executeFetchRequest:request error:nil]; 

हालांकि, मुझे लगता है कि समुच्चय का पूरक लाने के लिए चाहते हैं, यानी, मैं चाहता हूँ सब कोर डेटा में उपयोगकर्ता जिनके पास उपयोगकर्ता नाम सरणी में निर्दिष्ट उपयोगकर्ता नाम नहीं हैं। क्या किसी को यह पता है कि इस मुद्दे पर कैसे पहुंचे? मैंने सोचा कि (i.e., "userName NOT IN %@") भविष्य में "NOT" जोड़ने के लिए पर्याप्त आसान होगा, लेकिन एक्सकोड एक अपवाद फेंकता है कि भविष्यवाणी प्रारूप को पार्स नहीं किया जा सका। मैंने बिना किसी किस्मत के अनुरोध प्राप्त करने के लिए उपलब्ध भविष्य निर्माता का उपयोग करने का भी प्रयास किया। दस्तावेज विशेष रूप से सहायक नहीं था। सुझाव? टिप्पणियाँ?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (userName IN %@)", userNames]; 

बस इतना ही के एक अनुरोध लौटना चाहिए: धन्यवाद अपने सभी मदद :)

उत्तर

52

आदेश वस्तुओं है कि आपके सरणी में नहीं हैं खोजने के लिए, के लिए तुम सब करने की है कुछ इस तरह है आपके द्वारा निर्दिष्ट

+0

काफी सरल ... धन्यवाद, एसएलवी। – tomas

+0

शानदार। मैंने सोचा कि यह काम नहीं कर रहा था। लेकिन ऐसा इसलिए था क्योंकि मेरी सरणी में डेटा दूसरे क्षेत्र से था। धन्यवाद। सरल और प्रभावी। –

+0

नोट: यह NSNumber चर के साथ काम नहीं करता है जो शायद समझ में आता है लेकिन यदि आप NSNumber में enum लपेटते हैं तो शर्म की बात है। उस मामले में '[NSPredicate predicateWithFormat: @" NOT (enumWrapper IN {% d,% d}) ", enum1, enum2] जैसे कुछ का उपयोग करें। –

1

मैं मूल डेटा/उद्देश्य-सी पर मजबूत नहीं हूं लेकिन भविष्यवाणी निम्न कथन की तरह होनी चाहिए;

[predicateFormat appendFormat:@"not (some_field_name in {'A','B','B','C'})"]; 

एक उदाहरण:

NSMutableString * mutableStr = [[NSMutableString alloc] init]; 

//prepare filter statement 
for (SomeEntity * e in self.someArray) { 
    [mutableStr appendFormat:@"'%@',", e.key]; 
} 

//excluded objects exist 
if (![mutableStr isEqual:@""]) 
{ 
    //remove last comma from mutable string 
    mutableStr = [[mutableStr substringToIndex:mutableStr.length-1] copy]; 

    [predicateFormat appendFormat:@"not (key in {%@})", mutableStr]; 
} 

//... 
//use this predicate in NSFetchRequest 
//fetchRequest.predicate = [NSPredicate predicateWithFormat:predicateFormat]; 
//... 
0

यहाँ एक और उपयोगी उदाहरण के लिए, दिखा कैसे स्ट्रिंग की एक सूची ले, और बाहर फिल्टर करने के लिए किसी भी जो पत्र के साथ शुरू नहीं करते AZ है:

NSArray* listOfCompanies = [NSArray arrayWithObjects:@"123 Hello", @"-30'c in Norway", @"ABC Ltd", @"British Rail", @"Daily Mail" @"Zylophones Inc.", nil]; 

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF MATCHES[c] '^[A-Za-z].*')"]; 

NSArray *filteredList = [listOfCompanies filteredArrayUsingPredicate:bPredicate]; 

for (NSString* oneCompany in filteredList) 
    NSLog(@"%@", oneCompany); 

मैं इस प्रकार के NSPredicate का उपयोग करता हूं जब मैं एज़ेड इंडेक्स के साथ UITableView पॉप्युलेट कर रहा हूं, और उन चीज़ों के लिए "सबकुछ" अनुभाग चाहता हूं जो एक पत्र से शुरू नहीं होते हैं।

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