正确的方法/处理“CoreData无法解决”异常的最佳方法

时间:2010-10-04 05:44:23

标签: iphone core-data

我有一个核心数据问题,某些数据以某种方式被删除,我的iPhone应用程序将始终在启动时崩溃。当检测到“CoreData无法解决故障”时,我需要一种完全删除这些数据的方法。

有关如何执行此操作的任何建议或示例代码?

是否有最佳做法或正确的方法来处理此例外?

2 个答案:

答案 0 :(得分:0)

这个例子没有崩溃。

-(void)removePreviousDestinationsFromMainDatabaseForCarrier:(NSString *)carrierName 
{
NSManagedObjectContext *moc = [self managedObjectContext];

NSError *error = nil;
NSFetchRequest *requestCarrier = [[NSFetchRequest alloc] init];
[requestCarrier setEntity:[NSEntityDescription entityForName:@"Carrier" inManagedObjectContext:moc]];
[requestCarrier setPredicate:[NSPredicate predicateWithFormat:@"(name == %@)", carrierName]];
//[requestCarrier setIncludesPropertyValues:NO];
[requestCarrier setResultType:NSManagedObjectIDResultType];
//[requestCarrier setReturnsObjectsAsFaults:NO];
NSArray *carriers = [moc executeFetchRequest:requestCarrier error:&error];
if (error) NSLog(@"Failed to executeFetchRequest to data store: %@", [error localizedDescription]); 

NSManagedObjectID *carrier = [carriers lastObject]; 
//NSManagedObject *carrier = [carriers lastObject]; 

[moc deleteObject:[moc objectWithID:carrier]];
//[managedObjectContext deleteObject:carrier];

[requestCarrier release], requestCarrier = nil;
return;
}

这是正确的保存呼叫。隐藏所有可以认为你删除了对象的界面问题,以避免“在枚举时收集变异”

            [carriersTableView0 setHidden:YES];
            [deleteProcess0 setHidden:NO];
            [self removePreviousDestinationsFromMainDatabaseForCarrier:carrierName];
            [moc save:&error];
            [deleteProcess0 setHidden:YES];
            [carriersTableView0 setHidden:NO];

答案 1 :(得分:0)

我遇到了相同的症状(崩溃消息“CoreData无法完成故障”)并尝试了许多不同的变体(最常见的答案是检查线程安全,但它没有帮助我)。

最后,我决定尝试用Objective C NSNumber替换我用于某些数字属性的简单类型(float,int)并重新创建数据库。它解决了我的问题!

当然,这不是解决这个问题的唯一方法。我想,通常这个问题与线程安全性有关。但在某些情况下,它可能有所帮助。

实际上我认为在我的情况下,问题是由于在使用简单类型(而不是Objective C类型)更改DB表时使用RestKit导致数据库损坏。