iPhone Core Data "Production" Error handling


Answers

هذه هي الطريقة العامة التي توصلت إليها للتعامل مع أخطاء التحقق من الصحة وعرضها على iPhone. لكن ماركوس على حق: ربما تريد أن تقوم بتعديل الرسائل لتكون أكثر سهولة في الاستخدام. لكن هذا على الأقل يمنحك نقطة انطلاق لمعرفة ما هو الحقل الذي لم يتم التحقق منه ولماذا.

- (void)displayValidationError:(NSError *)anError {
    if (anError && [[anError domain] isEqualToString:@"NSCocoaErrorDomain"]) {
        NSArray *errors = nil;

        // multiple errors?
        if ([anError code] == NSValidationMultipleErrorsError) {
            errors = [[anError userInfo] objectForKey:NSDetailedErrorsKey];
        } else {
            errors = [NSArray arrayWithObject:anError];
        }

        if (errors && [errors count] > 0) {
            NSString *messages = @"Reason(s):\n";

            for (NSError * error in errors) {
                NSString *entityName = [[[[error userInfo] objectForKey:@"NSValidationErrorObject"] entity] name];
                NSString *attributeName = [[error userInfo] objectForKey:@"NSValidationErrorKey"];
                NSString *msg;
                switch ([error code]) {
                    case NSManagedObjectValidationError:
                        msg = @"Generic validation error.";
                        break;
                    case NSValidationMissingMandatoryPropertyError:
                        msg = [NSString stringWithFormat:@"The attribute '%@' mustn't be empty.", attributeName];
                        break;
                    case NSValidationRelationshipLacksMinimumCountError:  
                        msg = [NSString stringWithFormat:@"The relationship '%@' doesn't have enough entries.", attributeName];
                        break;
                    case NSValidationRelationshipExceedsMaximumCountError:
                        msg = [NSString stringWithFormat:@"The relationship '%@' has too many entries.", attributeName];
                        break;
                    case NSValidationRelationshipDeniedDeleteError:
                        msg = [NSString stringWithFormat:@"To delete, the relationship '%@' must be empty.", attributeName];
                        break;
                    case NSValidationNumberTooLargeError:                 
                        msg = [NSString stringWithFormat:@"The number of the attribute '%@' is too large.", attributeName];
                        break;
                    case NSValidationNumberTooSmallError:                 
                        msg = [NSString stringWithFormat:@"The number of the attribute '%@' is too small.", attributeName];
                        break;
                    case NSValidationDateTooLateError:                    
                        msg = [NSString stringWithFormat:@"The date of the attribute '%@' is too late.", attributeName];
                        break;
                    case NSValidationDateTooSoonError:                    
                        msg = [NSString stringWithFormat:@"The date of the attribute '%@' is too soon.", attributeName];
                        break;
                    case NSValidationInvalidDateError:                    
                        msg = [NSString stringWithFormat:@"The date of the attribute '%@' is invalid.", attributeName];
                        break;
                    case NSValidationStringTooLongError:      
                        msg = [NSString stringWithFormat:@"The text of the attribute '%@' is too long.", attributeName];
                        break;
                    case NSValidationStringTooShortError:                 
                        msg = [NSString stringWithFormat:@"The text of the attribute '%@' is too short.", attributeName];
                        break;
                    case NSValidationStringPatternMatchingError:          
                        msg = [NSString stringWithFormat:@"The text of the attribute '%@' doesn't match the required pattern.", attributeName];
                        break;
                    default:
                        msg = [NSString stringWithFormat:@"Unknown error (code %i).", [error code]];
                        break;
                }

                messages = [messages stringByAppendingFormat:@"%@%@%@\n", (entityName?:@""),(entityName?@": ":@""),msg];
            }
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Validation Error" 
                                                            message:messages
                                                           delegate:nil 
                                                  cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
            [alert show];
            [alert release];
        }
    }
}

استمتع.

Question

لقد رأيت في مثال التعليمة البرمجية المقدمة من قبل مراجع Apple لكيفية التعامل مع أخطاء Core Data. أي:

NSError *error = nil;
if (![context save:&error]) {
/*
 Replace this implementation with code to handle the error appropriately.

 abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
 */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

لكن لا توجد أي أمثلة لكيفية تنفيذها.

هل لدى أي شخص (أو يمكن أن يشير لي في اتجاه) بعض رمز "الإنتاج" الفعلي الذي يوضح الطريقة المذكورة أعلاه.

شكرا مقدما ، مات




أنا مندهش لا أحد هنا هو في الواقع التعامل مع الخطأ بالطريقة التي من المفترض أن يتم التعامل معها. إذا نظرت إلى الوثائق ، سترى.

تتضمن الأسباب النموذجية لخطأ هنا ما يلي: * نفاد مساحة الجهاز. * لا يمكن الوصول إلى المتجر الدائم ، بسبب الأذونات أو حماية البيانات عند قفل الجهاز. * تعذر ترحيل المتجر إلى إصدار الطراز الحالي. * الدليل الأصلي غير موجود أو لا يمكن إنشاؤه أو عدم السماح بالكتابة.

لذا ، إذا وجدت خطأ عند إعداد حزمة البيانات الأساسية ، فأنا أجرت التبديل rootViewController في UIWindow وأعرض واجهة المستخدم التي تخبر المستخدم بوضوح أن أجهزتهم قد تكون ممتلئة ، أو أن إعدادات الأمان الخاصة بهم مرتفعة جدًا بحيث يعمل هذا التطبيق. أعطيهم أيضًا زر "حاول مرة أخرى" ، حتى يتمكنوا من محاولة إصلاح المشكلة قبل إعادة محاولة تكديس مكدس البيانات الأساسي.

على سبيل المثال ، يمكن للمستخدم تحرير بعض مساحة التخزين ، والعودة إلى التطبيق الخاص بي والضغط على زر المحاولة مرة أخرى.

تؤكد؟ هل حقا؟ عدد كبير جدًا من المطورين في الغرفة!

أنا أيضا مندهش من عدد من الدروس على الانترنت التي لا تذكر كيف يمكن أن تفشل عملية حفظ لهذه الأسباب أيضا. لذلك ستحتاج إلى التأكد من أن أي حدث حفظ في أي تطبيق في تطبيقك قد يفشل لأن الجهاز JUST THIS MINUTE قد أصبح ممتلئًا بالحفظ التوفير في Apps.




Related