ฉันโยนคำตอบนี้ลงไปถึงแม้ว่ามันจะเป็นตัวอย่างของชาร์ลส์มากกว่า เอาท์พุทตรงจาก NSLog อาจเป็นระเบียบในการอ่านและตีความดังนั้นฉันชอบที่จะโยนในพื้นที่สีขาวและเรียกค่าคีย์ 'userInfo' ที่สำคัญบางอย่าง
นี่คือวิธีการที่ฉันใช้อยู่ ('_sharedManagedObjectContext' คือ #define สำหรับ '[[[UIApplication sharedApplication] ผู้รับมอบสิทธิ์] managedObjectContext]')
- (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' ซึ่งเมื่อฉันพบปัญหาจาก OP ชี้ไปที่เอนทิตี Core Data ที่ไม่ใช่ตัวเลือกที่ฉันลืมตั้งค่าก่อนที่จะบันทึก