code

iPhone Core Data Unresolved 오류 저장 중

starcafe 2023. 4. 18. 23:11
반응형

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

반응형