保存时iphone Core Data Unresolved错误

Ahm*_*otb 169 iphone core-data objective-c ios

我在尝试保存时从核心数据中收到一条奇怪的错误消息但是错误不可重现的问题(在执行不同的任务时出现在不同的时间)

错误信息:

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.)"
);
}
Run Code Online (Sandbox Code Playgroud)

并且生成错误的方法是:

- (IBAction)saveAction:(id)sender {
    NSError *error;
    if (![[self managedObjectContext] save:&error]) {
        // Handle error
        NSLog(@"Unresolved error %@, %@, %@", error, [error userInfo],[error localizedDescription]);
        exit(-1);  // Fail
    }
}
Run Code Online (Sandbox Code Playgroud)

这个消息的原因有什么想法吗?认为它出现在随机时间

Dav*_*ong 295

这意味着强制性财产被指定为零.在*.xcodatamodel中检查"可选"框或保存到managedObjectContext时,请确保填写了您的属性.

如果在更改代码后出现进一步的错误以满足这两个要求,请尝试清理构建并从iPhone模拟器/ iPhone设备中删除该应用程序.您的模型更改可能与旧模型实现冲突.

编辑:

我几乎忘记了核心数据吐出的所有错误代码: 核心数据常量参考 我以前遇到过这个问题而且我意识到我取消选中了正确的可选框.找出问题的麻烦.祝好运.

  • 这为我解决了。还要注意,至少以我的经验,即使没有将其保存到sqlite文件中,更改也确实进入了上下文。因此,发生这种情况时,行为可能会不稳定。 (2认同)

小智 233

我自己挣扎了一会儿.这里真正的问题是你得到的调试并没有告诉你问题是什么.原因是因为如果存在多个问题,CoreData会将NSError对象的数组放入它返回的"顶级"NSError对象中(这就是为什么你看到错误1560,这表明存在多个问题,以及一个错误数组) 16世纪70年代).看起来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]);
        }
    }
Run Code Online (Sandbox Code Playgroud)

它将生成输出,告诉您缺少的字段,这使得修复问题显着更容易处理.


clo*_*ach 21

我把它作为一个答案,尽管它更像是对查尔斯片段的修饰.NSLog的直接输出可能是一个混乱的读取和解释,所以我喜欢抛出一些空白区域并调出一些关键的'userInfo'键的值.

这是我一直在使用的方法的一个版本.('_sharedManagedObjectContext'是'[[[UIApplication sharedApplication]委托] managedObjectContext的'#fine]'.)

- (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;
}
Run Code Online (Sandbox Code Playgroud)

这允许我看到'NSValidationErrorKey'的值,当我从OP遇到问题时,它直接指向我在尝试保存之前忘记设置的非可选Core Data实体.