在我的应用程序中,由于此核心数据保存错误处理代码,我收到了一堆SIGABRT崩溃报告(来自特定用户):
NSError *error = nil;
if (![moc save:&error])
{
if(error)
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
有没有比使用abort()终止进程更好的方法来处理核心数据保存错误?
答案 0 :(得分:6)
基于save
错误不应出现在制作中的事实,我最好的建议是遵循类似的模式。
NSError *error = nil;
if ([self.managedObjectContext save:&error] == NO) {
NSAssert(NO, @"Save should not fail");
[self showAlert];
}
- (void)showAlert {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Could Not Save Data"
message:@"There was a problem saving your data but it is not your fault. If you restart the app, you can try again. Please contact support (support@domain.com) to notify us of this issue."
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
}
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
abort();
}
如NSManagedObjectContext save error中所述,致信 Matthew Morey 。
我非常喜欢这种方法,因为它告诉用户发生了一些不好的事情。 除此之外,我还将创建一个日志文件,可以通过电子邮件发送给支持人员。在日志中,您将提供尽可能多的信息来调查错误。例如,要实现此目的,您可以使用CocoaLumberjack。另请参阅NSSCreenCast的Mailing Logs。
答案 1 :(得分:3)
因此,核心数据实际上为您提供了大量有关为什么无法保存或为什么验证失败的信息。您可以提取该信息并以有用的方式将其呈现给用户,并让他/她修复它(以防我们讨论用户生成的数据)。这是我提出的解决方案:iPhone Core Data "Production" Error Handling
答案 2 :(得分:0)
使用此代码确定它可以帮助您
- (void)saveContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
abort();
}
}
}