我有一个核心数据问题,某些数据以某种方式被删除,我的iPhone应用程序将始终在启动时崩溃。当检测到“CoreData无法解决故障”时,我需要一种完全删除这些数据的方法。
有关如何执行此操作的任何建议或示例代码?
是否有最佳做法或正确的方法来处理此例外?
答案 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导致数据库损坏。