当托管对象上下文无法保存时,我该怎么办?

时间:2010-06-12 09:49:06

标签: iphone core-data

示例:我有一个具有catAge属性的Cat实体。在数据建模器中,我将catAge配置为int,最大值为100.然后我执行此操作:

[newManagedObject setValue:[NSNumber numberWithInt:125] forKey:@"catAge"];

// Save the context.
NSError *error = nil;
if (![context save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}

我在控制台中收到错误,如下所示:

2010-06-12 11:40:41.947 CatTest[2250:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=1610 UserInfo=0x10164d0 "Operation could not be completed. (Cocoa error 1610.)", {
    NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1610.)";
    NSValidationErrorKey = catAge;
    NSValidationErrorObject = <NSManagedObject: 0x10099f0> (entity: Cat; id: 0x1006a90 <x-coredata:///Cat/t3BCBC34B-8405-4F16-B591-BE804B6811562> ; data: {
    catAge = 125;
    catName = "No Name";
});
    NSValidationErrorPredicate = SELF <= 100;
    NSValidationErrorValue = 125;
}

好吧,我有一个验证错误。但奇怪的是,此后MOC似乎已被打破。如果我只是点击“添加”以添加另一个无效的Cat对象并保存,我就明白了:

2010-06-12 11:45:13.857 CatTest[2250:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=1560 UserInfo=0x1232170 "Operation could not be completed. (Cocoa error 1560.)", {
    NSDetailedErrors =     (
        Error Domain=NSCocoaErrorDomain Code=1610 UserInfo=0x1215f00 "Operation could not be completed. (Cocoa error 1610.)",
        Error Domain=NSCocoaErrorDomain Code=1610 UserInfo=0x1209fc0 "Operation could not be completed. (Cocoa error 1610.)"
    );
}

现在似乎报告了两个错误。但是:当我尝试从表格视图中删除现在有效的现有对象(使用基于导航的应用程序中的默认核心数据模板)时,应用程序崩溃了!我进入控制台的所有内容都是:

2010-06-12 11:47:18.931 CatTest[2250:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=1560 UserInfo=0x123eb30 "Operation could not be completed. (Cocoa error 1560.)", {
    NSDetailedErrors =     (
        Error Domain=NSCocoaErrorDomain Code=1610 UserInfo=0x1217010 "Operation could not be completed. (Cocoa error 1610.)",
        Error Domain=NSCocoaErrorDomain Code=1610 UserInfo=0x123ea80 "Operation could not be completed. (Cocoa error 1610.)"
    );
}

...所以不知道它崩溃的地点或原因,但确实如此。所以问题是,当出现验证错误时需要采取哪些必要步骤?

1 个答案:

答案 0 :(得分:7)

您遇到的崩溃可能与以前的错误无关,但如果没有相关的源代码,这几乎是不可能的。无论如何,为了正确处理您描述的情况,您有两种选择。您可以向用户报告错误,以便他/她可以修改违反验证检查的违规值,然后保存上下文,或者您必须从上下文中删除NSManagedObject

总体上有更好的策略。在保存上下文(使用自动生成的方法或您自己的方法)之前,不要让Core Data自动应用验证,而是在采取措施之前自己进行验证测试。使用NSManagedObject方法

执行此操作
- (BOOL)validateForInsert:(NSError **)error;
- (BOOL)validateForUpdate:(NSError **)error;
- (BOOL)validateForDelete:(NSError **)error;

如果这些方法返回YES,则可以继续。否则,如同之前警告用户并让他/她根据需要修改对象或删除对象。与前一种情况的区别在于,在这种情况下,您尚未保存上下文。仅当前面的方法返回YES时才保存上下文,因此您确定保存将成功。