2010-08-10 11 views
27

पर आधारित फ़िल्टरिंग मान मेरे पास एंट्री नामक कोर डेटा मॉडल ऑब्जेक्ट है। इसमें मेरे पास एक विशेषता है IFavorite।एनएसपी्रेडिकेट - एक बुलेन संग्रहीत मूल्य

मैं अपने NSFetchedResultsController के परिणामों को फ़िल्टर करने के लिए एक एनएसपी्रेडिकेट का उपयोग करना चाहता हूं।

वर्तमान में मुझे निष्पादन के दौरान EXC_BAD_ACCESS प्राप्त हो रहा है।

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
// Edit the entity name as appropriate. 

NSEntityDescription *thisEntry = [NSEntityDescription entityForName:@"Entry" inManagedObjectContext:managedObjectContext_]; 
[fetchRequest setEntity:thisEntry]; 

NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"Entry.isFavorite == %@", [NSNumber numberWithBool: YES]]; 

[fetchRequest setPredicate:predicate]; 


NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
aFetchedResultsController.delegate = self; 


NSError *error = nil; 
if (![aFetchedResultsController performFetch:&error]) { 
    NSlog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

अगर मैं लाइन है कि fetchRequest पर विधेय सेट निकालने के लिए, मेरे कोड पूरी तरह से निष्पादित करता है।

मैं भविष्य में स्पष्ट रूप से n00bin बाहर हूं लेकिन कोर डेटा मॉडल ऑब्जेक्ट से BOOLEAN मान पर संचालन करने के तरीके को जानने का प्रयास करने में बहुत परेशानी हुई है। यह नोट किया गया है कि स्ट्रिंग या इंट वैल्यू के साथ ऐसा करने के तरीके पर उत्तर हैं लेकिन मुझे एक बुलीयन उदाहरण नहीं मिल रहा है।

बहुत धन्यवाद!

उत्तर

37

यह NSPredicate को वास्तव में विशिष्ट नहीं है ... जब आपको कोई प्रारूप स्ट्रिंग में %@ है, इसी मूल्य एक वस्तु के लिए सूचक होना चाहिए, और BOOL योग्य नहीं है। तो हाँ पास करने की बजाय, [NSNumber numberWithBool: YES] पास करें।


Xcode के नए संस्करण और से जब मैं मूल रूप से जवाब लिखा SDKs में, आप @YES बजाय [NSNumber numberWithBool: YES] उपयोग कर सकते हैं।

+0

मैं अपने कोड ऊपर नवीनीकृत किया है - जो अभी भी EXC_BAD_ACCESS साथ दुर्घटनाओं :( यह इकाई हो जाएगा। विशेषता =? जैसा मैंने लिखा है? या सिर्फ विशेषता =? – Lance

+0

यह ऐप को क्रैश करने वाला नहीं है - आपकी मदद के लिए धन्यवाद – Lance

+1

यह मेरे लिए काम करता है अगर मैंने इस '[NSNumber numberWithBool: NO] जैसे NSNumber विवरण का उपयोग किया था विवरण]; ' –

22

क्या आप जानते हैं कि आप एक हाँ की तलाश कर रहे हैं (और इसलिए विभिन्न स्थितियों में हाँ के बीच स्विच या नहीं की जरूरत नहीं है), तो यह मेरे लिए काम किया:

[NSPredicate predicateWithFormat:@"isFavorite == 1"] 
+0

यह एक गतिशील मूल्य के लिए होना चाहिए। – KETAN

+5

@KETAN यदि आप जानते हैं कि आप YES की तलाश में हैं, तो @ "isFavorite == YES" काम करेगा। – brodney

+0

मुझे लगता है कि आपको "% @" का उपयोग करना चाहिए, @YES – OMGPOP

-1

मेरे लिए यह इस तरह से काम किया

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(isComplete LIKE[c] %@)",[NSString stringWithFormat:@"%@",[NSNumber numberWithBool:YES]]]; 
27

एप्पल के प्रलेखन से:

बूलियन मान

आप निर्दिष्ट कर और बूलियन मान निम्न उदाहरण में दर्शाया गया है की समानता के लिए परीक्षण:

NSPredicate *newPredicate = 
    [NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]]; 
NSPredicate *testForTrue = 
    [NSPredicate predicateWithFormat:@"anAttribute == YES"]; 

हालांकि, कुछ है कि मुझे बाहर पकड़ा:

Optional इकाई विशेषता untick के लिए सुनिश्चित करें और एक सेट Default ValueYES या NO, अन्यथा कॉलम खाली होगा (शून्य?) और उपर्युक्त भविष्यवाणियां उन पंक्तियों से मेल नहीं खातीं जो स्पष्ट रूप से सेट नहीं हैं।

परिणामस्वरूप सिम्युलेटर डेटाबेस को देखकर, मैंने इसका निदान करने के लिए महान ऐप sqllitebrowser का उपयोग किया।

+0

क्षमा करें @ जैनोस मुझे अभी तक बहुत तेज़ नहीं पता है। – scipilot

+0

"वैकल्पिक इकाई विशेषता को अनचेक करना सुनिश्चित करें" को इंगित करने के लिए बहुत बहुत धन्यवाद। मेरे घंटों बचाया! –

+0

मदद करने में खुशी हुई! मैंने इस पर घंटों बिताए ... अब मैं उस दाएं हाथ के पैनल पर अधिक ध्यान देता हूं, मैं तब तक इसे अनदेखा कर दूंगा। – scipilot

0

मेरे लिए, स्विफ्ट 3 पर।0 का उपयोग NSNumber और% @ काम नहीं किया, मैं पूर्णांक मूल्यों का इस्तेमाल किया था:

NSPredicate(format: "yourAttributeName == %i", yourBooleanValue ? 1 : 0) 
1

तेज 3 संस्करण मेरे लिए महान काम किया:

let predicate = NSPredicate(format: "isFriend == %@" ,NSNumber(booleanLiteral: false)) 

@scipilot bool का जवाब निम्नलिखित चाहिए नहीं एक वैकल्पिक हो। उसके लिए धन्यवाद!

0

आईओएस 10, xcode 9.0, बूलियन कोई विशेषता के साथ एक कोर डेटा managedObject की तलाश पर:

[NSPredicate predicateWithFormat:@"attributeName == nil"] 
संबंधित मुद्दे