iPhone Core Data Unresolved 오류 저장 중
저장하려고 하면 코어 데이터로부터 이상한 에러 메세지가 표시되지만, 에러가 재현할 수 없는 문제(다른 작업을 할 때 다른 시간에 표시됨)
에러 메시지:
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으로 할당되었다는 의미입니다.*.xcodatamodel에서 "옵션" 상자를 선택하거나 managedObjectContext에 저장할 때 속성이 채워져 있는지 확인하십시오.
두 가지 요구 사항에 맞게 코드를 변경한 후 더 많은 오류가 발생하는 경우 빌드를 정리하고 iPhone Simulator/iPhone 장치에서 응용 프로그램을 삭제하십시오.모델 변경이 이전 모델 구현과 충돌할 수 있습니다.
편집:
코어 데이터가 토해내는 에러 코드를 모두 잊어버릴 뻔했습니다.코어 데이터 상수 참조는 이전에 문제가 있었습니다만, 올바른 옵션 박스의 선택을 취소한 것을 깨달았습니다.문제를 발견하는 데 큰 어려움이 있다.행운을 빌어요.
저도 한동안 고생했어요.여기서 진짜 문제는 디버깅을 해도 무엇이 문제인지 알 수 없다는 것입니다.그 이유는 CoreData가 NSError 객체의 배열을 "최상위" NSError 객체에 배치하기 때문입니다(여러 문제가 있는 경우 오류 1560이 반환되고 오류 1570이 배열됩니다).CoreData에는 보다 유용한 정보(오류가 발생한 엔티티, 누락된 관계/속성 등)를 얻을 수 있는 문제가 있을 경우 반환되는 오류로 정보를 저장하기 위해 사용하는 키가 몇 개 있는 것으로 보입니다.userInfo 딕셔너리를 검사하기 위해 사용하는 키는 다음 참조 문서에서 찾을 수 있습니다.
다음은 저장 중 반환된 오류에서 적절한 출력을 얻기 위해 사용하는 코드 블록입니다.
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]);
}
}
누락된 필드를 알려주는 출력이 생성되므로 문제 해결이 훨씬 쉬워집니다.
찰스의 조각에 대한 장식에 더 가깝긴 하지만, 대답으로 이걸 던집니다.NSLog의 스트레이트 출력은 읽고 해석하는 데 혼란스러울 수 있습니다.따라서 공백 공간을 조금 더 들여서 중요한 '사용자'의 값을 불러내고 싶습니다.정보' 키
여기 제가 사용하고 있는 방법이 있습니다.('_sharedManagedObjectContext'는 '[[UIApplication sharedApplication] delegate] 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에서 문제가 발생했을 때 저장하기 전에 설정하지 않은 비옵션 핵심 데이터 엔티티를 직접 가리킵니다.
두 번째 레코드를 CoreData에 저장했을 때 문제가 발생하였습니다.옵션 이외의 필드(관계)도 모두 제로 없이 입력되어 있습니다만, 에러 출력에서는 최초로 보존된 오브젝트의 필드 중 하나가 제로인 것을 알 수 있습니다.좀 이상해요?그러나 그 이유는 매우 사소한 것입니다.첫 번째 오브젝트를 두 번째 오브젝트로 설정했을 때 1대 1의 관계가 무효가 됩니다.
계획은 다음과 같습니다.
"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)
부모에서 1 대 1로, 다 대 1로 관계를 변경하면 이 작업이 해결되었습니다.
선택사항이 아닌 유형 int의 일시적인 속성이 있었습니다.0으로 설정하면 1570 오류가 나타납니다.모든 일시적 속성을 옵션으로 변경했습니다.필요에 따라서, 제로 체크 로직을 코드로 실장할 수 있습니다.
즉, 모델이 검증에 실패했다는 것입니다.모델에서 사용되지 않은 속성, 필수 값으로 표시된 누락 등 여러 가지 이유로 인해 검증이 실패할 수 있습니다.정확히 무엇이 잘못되었는지 더 잘 이해하려면 개체를 저장할 준비가 된 위치에 중단점을 두고 다음 중 하나에 전화하십시오.validateFor...
다음과 같은 메서드 바리안트:
po [myObject validateForInsert]
이 문제에 대한 자세한 내용은 오류 설명을 참조하십시오.검증에 성공하면 출력이 표시되지 않습니다.
도움이 됐어요.이것도 체크해 주세요.
*.xcodatamodel 객체의 옵션박스를 켜겠습니다
언급URL : https://stackoverflow.com/questions/1283960/iphone-core-data-unresolved-error-while-saving
'code' 카테고리의 다른 글
iOS 7에서 내비게이션 바 색상을 변경하는 방법 (0) | 2023.04.23 |
---|---|
텍스트 파일 끝에 출력을 추가하는 방법 (0) | 2023.04.23 |
같은 컴퓨터에 여러 개의 GitHub 계정이 있습니까? (0) | 2023.04.18 |
WPF 응용 프로그램에서 클래스 라이브러리에 XAML 컨트롤을 복사한 후의 문제 (0) | 2023.04.18 |
Xcode 10.2.1 명령 PhaseScriptExecution이 0이 아닌 종료 코드로 실패했습니다. (0) | 2023.04.18 |