Macos 文件「;xyz";无法保存。出现多个验证错误

Macos 文件「;xyz";无法保存。出现多个验证错误,macos,core-data,Macos,Core Data,如果这有点模糊,我道歉,但这是问题的一半 我有一个基于文档的核心数据应用程序,我正在开发,它在运行时按指示执行,不会产生任何错误。但是,当用户保存文档时,文档会弹出一个“xyz”,文档“xyz”无法保存为“xyz”。“警报”中出现多个验证错误 我的问题是-您从哪里开始寻找修复/调试此问题?由于程序没有在调试器中倒下,我没有堆栈跟踪等。这可能是错误的实体关系,或者没有数据保存在实体的非可选属性中,或者。。。有没有一种方法可以准确地判断验证失败的原因 非常感谢您提出的任何最佳方式的建议 与此相关的是

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

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

我的问题是-您从哪里开始寻找修复/调试此问题?由于程序没有在调试器中倒下,我没有堆栈跟踪等。这可能是错误的实体关系,或者没有数据保存在实体的非可选属性中,或者。。。有没有一种方法可以准确地判断验证失败的原因

非常感谢您提出的任何最佳方式的建议

与此相关的是,在将来捕获这样一个错误的最佳方法是什么/如何,这样它就不会像用户那样远了


非常感谢

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


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

好,正如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;
}
-(NSError*)willPresentError:(NSError*)错误{
//只处理核心数据错误
如果(!([[error domain]IseQualtString:nsCoCaerorDomain])){
返回误差;
}
NSInteger errorCode=[错误代码];
如果((错误代码NSValidationErrorMaximum)){
返回误差;
}
//如果只有1个错误,则让常规警报显示它
if(错误代码!=NSValidationMultipleError){
返回误差;
}   
//获取错误。NSValidationMultipleErrorError-错误位于密钥NSDetailedErrorKey的userInfo字典中的数组中
NSArray*detailedErrors=[[error userInfo]objectForKey:NSDetailedErrorKey];
NSU整数错误计数=[detailedErrors计数];
NSMutableString*errorString=[NSMutableString stringWithFormat:@“存在%lu个验证错误:-”,errorCount];
对于(int i=0;i

注意:如果有100个错误,则您将收到一个包含100个项目的警报,这些项目不是最好的,但这是处理保存错误的良好起点。

通常的可疑属性是一个(或两个)未设置为
可选的属性,但没有任何值。
因此,为
awakeFromInsert
提供一个类别,该类别在
NSManagedObject的
生命周期中只调用一次

@implementation Entity (Entity_Category)

- (void) awakeFromInsert
{
[super awakeFromInsert];    

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

如果在core data属性中设置任何正则表达式验证,也会出现此类错误。也许你可以看看这个地区。我通过这种方式得到了这个错误。

我认为这是一个基于核心数据文档的Cocoa应用程序?谢谢。当我看到你的回复时,我刚刚找出了错误所在。我会将你的答案标记为正确,但我也会发布我的解决方案,这样我可以用一些代码充实它,以防其他人需要它。谷歌在这个问题上非常轻率,我能找到的唯一条目是人们抱怨他们购买的商业软件出现了这个错误!为那些公司感到羞耻。