2009-08-16 14 views
164

बचत मैं जब लेकिन समस्या यह है कि त्रुटि प्रतिलिपि प्रस्तुत करने योग्य नहीं है को बचाने की कोशिश कोर डेटा से एक अजीब त्रुटि संदेश मिल रहा है (यह अलग अलग समय पर प्रकट होता है जब विभिन्न कार्यों कर)iphone कोर डाटा समाधान नहीं किया गया त्रुटि

त्रुटि संदेश:

Unresolved error Domain=NSCocoaErrorDomain Code=1560 UserInfo=0x14f5480 "Operation could not be completed. (Cocoa error 1560.)", { 
NSDetailedErrors = (
Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x5406d70 "Operation could not be completed. (Cocoa error 1570.)", 
Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x14f9be0 "Operation could not be completed. (Cocoa error 1570.)" 
); 
} 

और विधि है कि त्रुटि उत्पन्न है:

- (IBAction)saveAction:(id)sender { 
    NSError *error; 
    if (![[self managedObjectContext] save:&error]) { 
     // Handle error 
     NSLog(@"Unresolved error %@, %@, %@", error, [error userInfo],[error localizedDescription]); 
     exit(-1); // Fail 
    } 
} 

इस संदेश के कारण के लिए कोई विचार है? यह यादृच्छिक समय पर दिखाई देता है

+0

यह आपकी मदद कर सकता है: "आईफोन कोर डेटा" उत्पादन "त्रुटि हैंडलिंग" http://stackoverflow.com/questions/2262704/iphone-core-data-production-error-handling/3510918#3510918 –

उत्तर

286

इसका मतलब है कि एक अनिवार्य संपत्ति नियुक्त की गई है। या तो अपनी * "वैकल्पिक" बॉक्स की जांच .xcodatamodel या जब आप managedObjectContext लिए बचत कर रहे हैं सुनिश्चित करें कि आपके गुण भर दिए गए हैं दो आवश्यकताओं की कोशिश सूट करने के लिए अपने कोड बदलने के बाद आगे त्रुटियों मिल रहे हैं बनाते हैं।

अपने आईफोन सिम्युलेटर/आईफोन डिवाइस से अपने निर्माण की सफाई और एप्लिकेशन को हटाएं। आपका मॉडल परिवर्तन पुराने मॉडल कार्यान्वयन के साथ संघर्ष कर सकता है।

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

मैं लगभग यहाँ भूल गया सभी त्रुटि कोड है कि कोर डाटा बाहर थूक दिया गया है: Core Data Constants Reference मैंने पहले इस समस्या आई और मैंने महसूस किया कि मैं सही वैकल्पिक बॉक्स अनचेक। समस्या को हल करने में ऐसी परेशानी। सौभाग्य।

+1

इसने इसे हल किया मुझे। यह भी ध्यान रखें कि कम से कम मेरे अनुभव में हालांकि यह SQLite फ़ाइल में सहेजा नहीं गया था, परिवर्तनों ने संदर्भ में अपना रास्ता बना दिया था। तो ऐसा होने पर व्यवहार अनियमित हो सकता है। – nickthedude

+0

मुझे मूल कारण नहीं मिल सका लेकिन मैं सभी गुणों को वैकल्पिक बनाकर समस्या को दूर करने में कामयाब रहा। –

+0

क्या आपने चार्ल्स कोड को आजमाया था, यह आपको बताएगा कि कौन सा क्षेत्र समस्या है। –

232

मैंने थोड़ी देर के लिए इसके साथ संघर्ष किया। यहां वास्तविक समस्या यह है कि आपको मिली डिबगिंग आपको यह नहीं दिखा रही है कि समस्या क्या है। इसका कारण यह है कि कोरडाटा "शीर्ष स्तर" एनएसईआरआर ऑब्जेक्ट में एनएसईआरआर ऑब्जेक्ट्स की एक सरणी डाल देगा यदि एक से अधिक समस्याएं होती हैं (यही कारण है कि आपको त्रुटि 1560 दिखाई देती है, जो कई समस्याओं को इंगित करती है, और त्रुटि की एक श्रृंखला 1570s)। ऐसा प्रतीत होता है कि कोरडाटा में कुछ हद तक चाबियाँ हैं जो इसे किसी त्रुटि के बारे में जानकारी को छीनने के लिए उपयोग करती हैं, यदि कोई समस्या है जो आपको अधिक उपयोगी जानकारी देगी (जैसे कि जिस त्रुटि पर त्रुटि हुई थी, रिश्ते/विशेषता जो गायब थी, इत्यादि।)। उपयोगकर्ता इन्फ्लो डिक्शनरी का निरीक्षण करने के लिए आप जिस कुंजी का उपयोग करते हैं, वह the reference docs here में पाया जा सकता है।

यह मैं त्रुटि से उचित उत्पादन प्राप्त करने के लिए का उपयोग कोड के ब्लॉक की वापसी हुई है एक को बचाने:

NSError* error; 
    if(![[survey managedObjectContext] save:&error]) { 
     NSLog(@"Failed to save to data store: %@", [error localizedDescription]); 
     NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; 
     if(detailedErrors != nil && [detailedErrors count] > 0) { 
      for(NSError* detailedError in detailedErrors) { 
       NSLog(@" DetailedError: %@", [detailedError userInfo]); 
      } 
     } 
     else { 
      NSLog(@" %@", [error userInfo]); 
     } 
    } 

यह उत्पादन आपके द्वारा फ़ील्ड कि लापता में हैं बताता है, जो इस समस्या को ठीक करता है का उत्पादन करेगा निपटने के लिए काफी आसान है।

+0

इस कोड के लिए बहुत बहुत धन्यवाद। यह CoreData समस्या वास्तव में बहुत आसान ट्रैकिंग ट्रैकिंग बनाता है। – MiKL

+0

धन्यवाद, मैंने अपने स्निपेट को अपने एक्सकोड में पंजीकृत किया है ... :) – barley

21

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

यहां विधि का एक संस्करण है जिसका मैं उपयोग कर रहा हूं।

- (BOOL)saveData { 
    NSError *error; 
    if (![_sharedManagedObjectContext save:&error]) { 
     // If Cocoa generated the error... 
     if ([[error domain] isEqualToString:@"NSCocoaErrorDomain"]) { 
      // ...check whether there's an NSDetailedErrors array    
      NSDictionary *userInfo = [error userInfo]; 
      if ([userInfo valueForKey:@"NSDetailedErrors"] != nil) { 
       // ...and loop through the array, if so. 
       NSArray *errors = [userInfo valueForKey:@"NSDetailedErrors"]; 
       for (NSError *anError in errors) { 

        NSDictionary *subUserInfo = [anError userInfo]; 
        subUserInfo = [anError userInfo]; 
        // Granted, this indents the NSValidation keys rather a lot 
        // ...but it's a small loss to keep the code more readable. 
        NSLog(@"Core Data Save Error\n\n \ 
         NSValidationErrorKey\n%@\n\n \ 
         NSValidationErrorPredicate\n%@\n\n \ 
         NSValidationErrorObject\n%@\n\n \ 
         NSLocalizedDescription\n%@", 
         [subUserInfo valueForKey:@"NSValidationErrorKey"], 
         [subUserInfo valueForKey:@"NSValidationErrorPredicate"], 
         [subUserInfo valueForKey:@"NSValidationErrorObject"], 
         [subUserInfo valueForKey:@"NSLocalizedDescription"]); 
       } 
      } 
      // If there was no NSDetailedErrors array, print values directly 
      // from the top-level userInfo object. (Hint: all of these keys 
      // will have null values when you've got multiple errors sitting 
      // behind the NSDetailedErrors key. 
      else { 
        NSLog(@"Core Data Save Error\n\n \ 
         NSValidationErrorKey\n%@\n\n \ 
         NSValidationErrorPredicate\n%@\n\n \ 
         NSValidationErrorObject\n%@\n\n \ 
         NSLocalizedDescription\n%@", 
         [userInfo valueForKey:@"NSValidationErrorKey"], 
         [userInfo valueForKey:@"NSValidationErrorPredicate"], 
         [userInfo valueForKey:@"NSValidationErrorObject"], 
         [userInfo valueForKey:@"NSLocalizedDescription"]); 

      } 
     } 
     // Handle mine--or 3rd party-generated--errors 
     else { 
      NSLog(@"Custom Error: %@", [error localizedDescription]); 
     } 
     return NO; 
    } 
    return YES; 
} 

यह मैं हूँ 'NSValidationErrorKey' है, जो है, जब मैं से इस मुद्दे का सामना करना पड़ा के लिए मान देख सकते हैं ('_sharedManagedObjectContext' के लिए '[[[UIApplication sharedApplication] प्रतिनिधि] managedObjectContext]'। एक #define है) ओपी, सीधे गैर-वैकल्पिक कोर डेटा इकाइयों को इंगित करता है जिन्हें मैं सहेजने की कोशिश करने से पहले सेट करना भूल गया था।

+0

भी बहुत उपयोगी है। विशेष रूप से जब आपको यह कच्चा \ n \ n \ n मूल डेटा इकाई विवरण स्ट्रिंग मिलता है। – Lukasz

+0

साफ। 'संदेश' अप्रयुक्त बीटीडब्ल्यू है। – pojo

0

समस्या मुझे छुआ, जब मैं CoreData को दूसरा रिकॉर्ड सहेजता हूं। सभी वैकल्पिक फ़ील्ड्स (रिश्ते) बिना शून्य के भरे हुए थे, लेकिन त्रुटि आउटपुट में मुझे पता चलेगा कि पहले सहेजे गए ऑब्जेक्ट में फ़ील्ड में से एक शून्य हो गया था। थोड़ा अजीब? लेकिन कारण काफी छोटा है - एक से एक रिश्ते जो पहली वस्तु को रद्द करता है, जब मैं इसे दूसरे में सेट करता हूं।

तो, योजना है:

"Parent" with relationship "child" One to One 
Create Child 1, set parent. Save - OK 
Create Child 2, set parent. Save - Error, Child 1.Parent == nil 
(behind the scene child 2 did nullify child 1 parent) 

एक इस कार्य को हल करने के लिए कई करने के लिए एक करने के लिए एक से अभिभावकीय में संबंध बदल रहा है।

0

मेरे पास प्रकार int की क्षणिक संपत्ति थी जो वैकल्पिक नहीं थी। जाहिर है, जब यह 0 पर सेट किया गया था, 1570 त्रुटि प्रकट होती है। बस मेरी सभी क्षणिक गुणों को वैकल्पिक में बदल दिया। यदि आवश्यक हो तो कोड में नील-चेक तर्क लागू किया जा सकता है।

0

मेरा मतलब है कि आपका मॉडल मान्य करने में विफल रहा है, जो कई कारणों से हो सकता है: आपके मॉडल में अप्रयुक्त संपत्ति, अनुपलब्ध मान जो आवश्यकतानुसार चिह्नित है। वास्तव में क्या गलत हो गया था, एक जगह है जहाँ आप अपनी वस्तु को बचाने के लिए तैयार कर रहे हैं में एक ब्रेकपाइंट डाल का एक बेहतर समझ पाने के लिए, और validateFor... विधि वेरिएंट में से एक कहते हैं, जैसे:

po [myObject validateForInsert]

में अधिक विस्तृत जानकारी समस्या के बारे में त्रुटि विवरण में है। सफल सत्यापन का मतलब है कि आपको कोई आउटपुट नहीं मिलेगा।

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