2011-05-08 76 views
1

道歉,如果这有点模糊,但这是问题的一半。文件“xyz”无法保存。出现多个验证错误

我有一个基于文档的核心数据应用程序,我正在做它正在做什么它在运行时告诉并且不会产生任何错误。但是当用户保存文档时,文档会弹出一个'The document“xyz”不能保存为“xyz”。出现多个验证错误'警报。

我的问题是 - 你在哪里开始寻找修复/调试呢?由于该程序不会在调试器中崩溃,所以我没有堆栈跟踪等。这是否可能是一个错误的实体关系,或没有数据被保存在一个实体的非可选属性或...有没有办法确切地说明什么是失败的验证?

任何建议最好的方式进行非常感谢。

与此相关的是,在将来如何捕捉这种错误的最佳方法是什么/如何,因此它不会像用户那么远。

非常感谢

+0

我把它这是一个核心数据基于文档的可可应用程序? – TechZen 2011-05-09 13:21:05

回答

2

验证错误提示,问题在保存文档时应用验证谓语规定。反过来,这意味着您试图保存的一些数据是错误的类型或错误的值。

如果从捕获操作捕获错误返回,则userInfo字典应包含有关失败的详细信息。

+0

谢谢。当我看到您的回复时,我刚刚制定了捕获错误的地方。我会将你的答案标记为正确的,但我也会发布我的解决方案,以便我可以用一些代码充实它,以防其他人需要它。谷歌在这个问题上很轻松,我能找到的唯一条目是人们抱怨他们购买的商业软件给出了这个错误!对这些公司感到羞耻。 – 2011-05-09 21:34:32

4

好的,正如TechZen的建议,从保存操作捕获错误。以下内容添加到MyDocument.m

- (NSError *)willPresentError:(NSError *)error { 

    // Only deal with Core Data Errors 
    if (!([[error domain] isEqualToString:NSCocoaErrorDomain])) { 
     return error; 
    } 
    NSInteger errorCode = [error code]; 
    if ((errorCode < NSValidationErrorMinimum) || (errorCode > NSValidationErrorMaximum)) { 
     return error; 
    } 

    // If there is only 1 error, let the usual alert display it 
    if (errorCode != NSValidationMultipleErrorsError) { 
     return error; 
    } 

    // Get the errors. NSValidationMultipleErrorsError - the errors are in an array in the userInfo dictionary for key NSDetailedErrorsKey 
    NSArray *detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; 
    NSUInteger errorCount = [detailedErrors count]; 
    NSMutableString *errorString = [NSMutableString stringWithFormat:@"There are %lu validation errors:-", errorCount]; 
    for (int i = 0; i < errorCount; i++) { 
     [errorString appendFormat:@"%@\n", 
      [[detailedErrors objectAtIndex:i] localizedDescription]]; 
    } 

    // Create a new error with the new userInfo and return it 
    NSMutableDictionary *newUserInfo = [NSMutableDictionary dictionaryWithDictionary:[error userInfo]]; 
    [newUserInfo setObject:errorString forKey:NSLocalizedDescriptionKey]; 
    NSError *newError = [NSError errorWithDomain:[error domain] code:[error code] userInfo:newUserInfo]; 
    return newError; 
} 

注意如果有100个错误,那么你会得到一个警报,100个项目中,是不是最好的,但是这是处理与保存错误一个很好的起点。

0

通常的嫌疑人是属性(或两个)未设置为OPTIONAL,但没有任何价值。 所以提供awakeFromInsert的类别,在NSManagedObject's生命周期中仅被称为一次。

@implementation Entity (Entity_Category) 

- (void) awakeFromInsert 
{ 
[super awakeFromInsert];  

[self setPrimitiveValue:[NSDate date] forKey:@"dateCreate"]; 
[self setPrimitiveValue:[NSDate date] forKey:@"dateUpdate"]; 
} 
  • 使用setPrimitiveValue避免避免记录作为UNDO