2011-08-18 19 views
9

मुझे अपने NSManagedObject के BOOL विशेषता को परिवर्तित करते समय क्रैश हो रहा है।कोर डेटा NSInvalidArgumentException त्रुटि

वस्तु को बचाने के लिए कोड है:

self.detailItem.bookmark = [NSNumber numberWithBool:YES]; 
NSError *error = nil; 
if (! [self.detailItem.managedObjectContext save:&error]) 
{ 
    // Handle the error. 
} 
NSLog(@"%@", error); 

और त्रुटि:

Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet. with userInfo (null) 
2011-08-18 15:41:32.866 Codes[5260:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet.' 
+0

आपको और कोड जोड़ने की आवश्यकता है - आपका विवरण क्या है Iemem जैसा दिखता है; क्या यह सिर्फ एक एनएसएमएनेज ऑब्जेक्ट है? – deanWombourne

+0

हाँ, 'detailItem'' बुकमार्क 'नामक एक बूल विशेषता वाला एक NSManagedObject है। –

उत्तर

7

चेतावनी: यह जवाब एक अनुमान मैं त्रुटि संदेश के आधार पर बनाया है पर आधारित है; यह 100% गलत हो सकता है!


त्रुटि लग रहा है यह एक गलत तरीके से गठन NSPredicate है जैसे। आप की तरह

NSString *name = @"Bob"; 
[NSPredicate predictaeWithFormat:@"ANY %K IN %@", @"name", name]; 

कुछ यह कुछ भी जहां name = 'Bob' लेकिन यह नहीं है, यह एक अपवाद :(

फेंक होगा मिल सकती है जैसे आप 'में आप उत्तीर्ण करने की आवश्यकता उपयोग कर रहे हैं लग रहा है कि हो सकता है ।। यानी एक NSSet या NSArray

NSArray *names = [NSArray arrayWithObjects:@"Alice", @"Bob", nil]; 
[NSPredicate predictaeWithFormat:@"ANY %K IN %@", @"name", names]; 

यह नाम 'बॉब' या 'ऐलिस' के साथ कुछ भी मिलेगा

तुम सिर्फ 'बॉब' के लिए खोज करना चाहता था, तो बस इस कार्य करें:

NSString *name = @"Bob"; 
[NSPredicate predictaeWithFormat:@"%K == %@", @"name", name]; 
+0

इस वीसी में कोई भविष्यवाणी नहीं है। हालांकि मेरे पास अलग-अलग वीसी है जिसमें यह अनुमान है '[एनएसपी्रेडिकेट predicateWithFormat: @ "कोई भी बुकमार्क == हाँ"];' क्या वहां कुछ गड़बड़ है? –

+1

त्रुटि का तात्पर्य है कि यह कुछ अन्य ऑब्जेक्ट है जो आपके प्रबंधित ऑब्जेक्ट में बदलावों में रूचि रखता है जो अपवाद पैदा कर रहा है, इसलिए यह अनुमानित हो सकता है।इसे 'किसी भी' के बिना आज़माएं और देखें कि क्या होता है? – deanWombourne

+0

कोशिश की लेकिन अभी भी एक दुर्घटना है। वीसी के लिए हम काम कर रहे हैं, कि ऑब्जेक्ट से संबंधित सभी कोड, ऑब्जेक्ट को पैरेंट व्यू से धक्का दिया जाता है। मेरे पास कोई एमओसी कोड नहीं है क्योंकि वस्तु को एमओसी को स्वयं खींचना चाहिए। –

3

मैं deanWornbourne सही जवाब लिखा लगता है, लेकिन यह मेरे लिए बहुत स्पष्ट तो मैं अपने जवाब और अंतर्दृष्टि को फिर से, और एक और स्पष्टीकरण प्रदान करने जा रहा हूँ नहीं था।

प्रोग्रामगू को गंभीर एप्लिकेशन त्रुटि मिल रही थी क्योंकि उसकी भविष्यवाणी गलत थी। ANY bookmark == YES का कारण गलत है कि "कोई भी" केवल तभी उपयोग किया जाता है जहां आपके मॉडल में एक से अधिक संबंध हैं। जब आपके पास एक-से-एक संबंध होता है, तो आपको bookmark == YES का उपयोग करना चाहिए।

'गंभीर एप्लिकेशन त्रुटि' थोड़ा मूर्खतापूर्ण ध्वनि है और आवश्यक से अधिक अलार्म का कारण बनती है। हालांकि, यह आपको त्रुटि के लिए एक बहुत अच्छा सुराग देता है। यह कहता है कि 'पर्यवेक्षक के भीतर बग' है। इसका मतलब है कि आपके पास कुछ 'NSFetchedResults' ऑब्जेक्ट या 'NSFetchedResultsController' सेटअप है (क्योंकि हम NSManagedObjectContextObjectChangedNotification के बारे में बात कर रहे हैं)। इसके अलावा, त्रुटि संदेश left hand side for an ALL or ANY operator must be either an NSArray कहता है ... यह संकेत दे रहा है कि एक से कई रिश्ते होना चाहिए।

उम्मीद है कि मदद करता है।

0

बस एक एफवाईआई। मेरे मामले में डीनवॉम्बर्न का जवाब 100% सही था।

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyTeamSchedule" inManagedObjectContext:[[MyTeamStore sharedStore] context]]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY myteam.teamname == %@", myTeamName]; 

किसी भी को हटाने के बाद समस्या हल हो गई। डीन के लिए भगवान का शुक्र है! बस मुझे समस्या निवारण और सिरदर्द के कई घंटों से बचाया।

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