我在保存对托管对象上下文的更改时遇到错误,但是我的错误处理程序有问题:错误是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];
}
答案 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]
将执行此操作。