【问题标题】:Document "xyz" could not be saved. Multiple validation errors occured无法保存文档“xyz”。发生多个验证错误
【发布时间】:2011-05-08 22:22:46
【问题描述】:

抱歉,如果这有点含糊,但这是问题的一半。

我正在开发一个基于文档的核心数据应用程序,它在运行时按照它的指示执行操作,并且不会产生任何错误。但是当用户保存文档时,文档会弹出“文档“xyz”无法保存为“xyz”。出现多个验证错误的警报。

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

非常感谢任何关于最佳方式的建议。

与此相关,未来捕获此类错误的最佳方法是什么/如何,这样它就不会影响到用户。

非常感谢

【问题讨论】:

  • 我认为这是一个基于 Core Data 文档的 Cocoa 应用程序?

标签: macos core-data


【解决方案1】:

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

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

【讨论】:

  • 谢谢。当我看到您的回复时,我刚刚弄清楚在哪里捕获错误。我会将您的答案标记为正确,但我也会发布我的解决方案,以便我可以用一些代码充实它,以防其他人需要它。谷歌在这个问题上很轻,我能找到的唯一条目是人们抱怨他们购买的商业软件给出了这个错误!为这些公司感到羞耻。
【解决方案2】:

好的,正如 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 个不是最好的项目的警报,但这是处理保存错误的一个很好的起点。

【讨论】:

    【解决方案3】:

    通常的嫌疑人是一个(或两个)未设置为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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-16
        • 1970-01-01
        • 1970-01-01
        • 2020-04-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多