2010-06-12 44 views
3

示例:我有一个具有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被打破了。如果我只需轻点“Add”添加另一个无效猫对象和保存,我得到这样的:

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

+1你一直在问关于核心数据的一系列深思熟虑的问题。未来的SO读者会发现这些非常有用。 – TechZen 2010-06-12 17:01:46

+1

我的大目标是要求在SO上提出10.000个问题。只是因为我很好奇;)我放弃了我的日常工作,以便能够这样做(不是开玩笑)。 – dontWatchMyProfile 2010-06-13 07:46:02

回答

7

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

有一个总体上更好的策略。在保存上下文(使用自动生成的方法或自己的方法)之前,不要让核心数据应用自动验证,而应该在采取操作之前进行验证测试。为此,使用NSManagedObject方法

- (BOOL)validateForInsert:(NSError **)error; 
- (BOOL)validateForUpdate:(NSError **)error; 
- (BOOL)validateForDelete:(NSError **)error; 

如果这些方法返回YES,你可以继续进行。否则,像以前一样提醒用户,让他/她根据需要修改对象或删除对象。与之前的情况不同的是,在这种情况下,您还没有保存上下文。只有在前面的方法返回YES时才保存上下文,所以您确定保存会成功。

+1

+1另外,当它很重要时,我会调用自定义设置器中属性的验证方法,并在设置之前将其传递给输入。如果遇到问题,可以立即退出。 – TechZen 2010-06-12 17:00:47

+0

其实我完全一样:正如你指出的那样,恕我直言,在保存数据之前立即回溯并警告用户。 – 2010-06-12 17:16:37

+0

这是一个好主意。当涉及到每位制片人的验证时,由于性能,我会保持谨慎。在某些情况下,我可以想象在每组中都不好验证。现在想不到一个好的例子,但也许是一个颜色选择器,它不断分析所选的颜色,并查看它是否与网络上的CI调色板相匹配。 – dontWatchMyProfile 2010-06-13 07:53:52

相关问题