无法保存文档“xyz”。发生了多个验证错误

时间:2011-05-08 22:22:47

标签: macos core-data

道歉,如果这有点模糊,但这只是问题的一半。

我正在处理一个基于文档的核心数据应用程序,它正在执行运行时所说的内容并且不会产生任何错误。但是当用户保存文档时,文档弹出“文档”xyz“无法保存为”xyz“。发生了多次验证错误'警告。

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

对最佳方式的任何建议都非常感激。

与此相关,未来捕获此类错误的最佳方法是什么/如何,因此它无法达到用户的目的。

非常感谢

4 个答案:

答案 0 :(得分: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个项目的警报,其中不是最好的,但这是处理保存错误的良好起点。

答案 1 :(得分:2)

验证错误表明问题与保存文档时应用的验证谓词有关。反过来,这意味着您尝试保存的某些数据类型错误或值错误。

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

答案 2 :(得分: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
  • 进行录制

答案 3 :(得分:0)

如果您在核心数据属性中设置了任何正则表达式验证,则也会出现此类错误。也许您可以检查一下该区域。通过这种方式我得到了这个错误。