示例:我有一个具有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.)"
    );
}
...所以不知道它崩溃的地点或原因,但确实如此.所以问题是,当出现验证错误时,需要采取哪些必要步骤?
您遇到的崩溃可能与以前的错误无关,但如果没有相关的源代码,这几乎是不可能的.无论如何,为了正确处理您描述的情况,您有两种选择.您可以向用户报告错误,以便他/她可以修改违反验证检查的违规值,然后保存上下文,或者您必须从上下文中删除NSManagedObject.
有一个总体更好的策略.在保存上下文(使用自动生成的方法或您自己的方法)之前,不要让Core Data自动应用验证,而是在采取措施之前自己进行验证测试.使用这些NSManagedObject方法执行此操作
- (BOOL)validateForInsert:(NSError **)error;
- (BOOL)validateForUpdate:(NSError **)error;
- (BOOL)validateForDelete:(NSError **)error;
如果这些方法返回YES,则可以继续.否则,如同之前警告用户并让他/她根据需要修改对象或删除对象.与前一种情况的区别在于,在这种情况下,您尚未保存上下文.仅当前面的方法返回YES时才保存上下文,因此您确定保存将成功.
| 归档时间: | 
 | 
| 查看次数: | 2771 次 | 
| 最近记录: |