代码之家  ›  专栏  ›  技术社区  ›  dontWatchMyProfile

当托管对象上下文无法保存时,我应该怎么做?

  •  3
  • dontWatchMyProfile  · 技术社区  · 14 年前

    示例:我有一个具有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;
    }
    

    嗯,所以我有一个验证错误。但奇怪的是,在这之后,主运行中心似乎被打破了。如果我只是点击“添加”来添加另一个无效的cat对象并保存它,我会得到:

    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 回复  |  直到 14 年前
        1
  •  7
  •   Massimo Cafaro    14 年前

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

    有一个总体上更好的策略。在保存上下文之前(使用自动生成的方法或您自己的方法),不要让核心数据自动应用验证,而是在执行操作之前,对自己进行验证测试。使用 被管理对象 方法

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

    如果这些方法返回“是”,则可以继续。否则,如前所述,提醒用户,让他/她根据需要修改对象或删除对象。与前一种情况不同的是,在这种情况下,您没有保存上下文。只有在前面的方法返回Yes时才保存上下文,因此可以确保保存成功。