核心数据保存托管对象上下文 - 错误指针为零

时间:2012-12-14 19:29:32

标签: objective-c core-data pointers

我在保存对托管对象上下文的更改时遇到错误,但是我的错误处理程序有问题:错误是nil,因此没有给我任何有用的信息。我有两个版本的错误处理程序。这个是由Xcode生成的,它可以工作(即日志消息包含有用的错误信息):

AppDelegate.c

- (void)saveContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil)
{
    if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
    {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    } 
}
}

但我希望能够通过成功/失败(最终,现在我只是中止)+错误信息回到调用者,所以我有这个,这不起作用(错误是零,所以没有提供有关错误的有用信息。)

Database.h

+ (BOOL) commit:(NSError **)error;

Database.c

+ (BOOL) commit:(NSError **)error {


AppDelegate *appDelegate = (AppDelegate*) [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;

if (managedObjectContext != nil)
{
    if ([managedObjectContext hasChanges] && ![managedObjectContext save:error])
    {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
         */
        if (error == nil) {
            NSLog(@"Unresolved error");
            abort();
        } else {
            NSLog(@"Unresolved error %@, %@", *error, [*error userInfo]);
            abort();
            //return FALSE;
        }
    }
    return TRUE;
}
return FALSE;
}

我很确定我的问题在于指针,并且在重定向层中迷失了。

[编辑:] 调用commit的代码:

[Database commit:nil];

我想知道是否需要在commit方法的开头添加这样的东西,但我不确定指针:

if (error == nil) {
    error = [[NSError alloc] init];
}

2 个答案:

答案 0 :(得分:1)

我认为您需要在第二个版本中传递错误地址吗?

[managedObjectContext save:error]

应该是:

[managedObjectContext save:&error]

这允许接收方法控制指针(指针指向的指针)引用的内容。

答案 1 :(得分:1)

如果使用commit:(来自您的评论)调用nil,则可能是错误。您必须使用错误变量的地址调用您的函数:

NSError *error = nil;
if (![Database commit:&error]) {
    // commit failed, "error" contains error message.
}
return NO方法的错误情况下,

当然是abort()而不是commit

无需在commit方法中分配错误消息。如果保存失败,[managedObjectContext save:error]将执行此操作。