बचत करते समय iPhone कोर डेटा अनारक्षित त्रुटि


169

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

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

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
    }
}

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


यह आपकी मदद कर सकता है: "iPhone कोर डेटा" उत्पादन "त्रुटि हैंडलिंग" stackoverflow.com/questions/2262704/…
जोहान्स फ़ारेनक्रग

जवाबों:


296

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

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

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

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


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

मैं मूल कारण पर नहीं पहुंच सका लेकिन मैंने सभी संपत्तियों को वैकल्पिक बनाकर इस समस्या को दूर कर दिया।
माइकल ओसोफस्की

क्या आपने चार्ल्स के कोड की कोशिश की, यह आपको बताएगा कि समस्या किस क्षेत्र की है।
डेविड वॉन्ग

233

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

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

    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]);
        }
    }

यह उत्पादन का उत्पादन करेगा जो आपको उन क्षेत्रों को बताता है जो गायब हैं, जो समस्या को हल करने में काफी आसान बनाता है।


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

21

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

यहां उस विधि का एक संस्करण है जिसका मैं उपयोग कर रहा हूं। ('_saredManagedObjectContext' '[[[UIApplication साझाApplication] डेलीगेट] ManageObjectContext]' के लिए एक #define है। '')

- (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' के मूल्य को देखने की अनुमति देता है, जो, जब मुझे ओपी से समस्या का सामना करना पड़ा, तो सीधे गैर-वैकल्पिक कोर डेटा संस्थाओं को इंगित किया जिन्हें मैं सहेजने की कोशिश करने से पहले सेट करना भूल गया था।


साथ ही बहुत उपयोगी है। विशेष रूप से जब आपको यह रॉ \ n \ n \ n कोर डेटा एंट्री विवरण स्ट्रिंग्स मिले।
लुकाज़ 13

साफ। 'संदेश' अप्रयुक्त btw है।
पूजो

0

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

तो, योजना है:

"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

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


0

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

po [myObject validateForInsert]

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


0

इसने मेरी मदद की। यह भी एक की जाँच करें।

अपने * .xcodatamodel ऑब्जेक्ट में वैकल्पिक बॉक्स की जाँच करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.