我们的应用程序有一个捆绑的SQL数据库,我们使用默认的FileManager从捆绑包中复制。
application:didFinishLaunchingWithOptions:
数据库具有我们存储在NSUserDefaults中的版本号。
直到最近我们需要更新数据库时,这仍然没有任何问题。我们检测到需要升级并从FileManager中删除旧的.sqlite文件并替换为新的bundle值。这是在应用程序读取任何数据之前在didFinishLaunchingWithOptions中完成的。
对于我们的大多数用户来说,这种方法效果很好,但对于少数人来说,他们的数据库已经在某种程度上被破坏了,他们得到了
NSObjectInaccessibleException CoreData could not fulfill a fault
每当他们尝试访问数据时。人们声称,当您有多个线程编辑数据库中的数据时,通常会发生此异常。但是,我们的数据是静态的,没有更新或编辑。我们有一个managedObjectContext,我们使用NSFetchedResultsController在UITableViewController中显示数据。
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
即使重启设备,应用仍会处于损坏状态。
任何人都可以解释可能发生的情况以及我们如何更改方法以防止其发生或者在检测到故障后我们如何恢复?
我们尝试使用
检测故障if ([self.managedObjectContext existingObjectWithID:[theState objectID] error:&error]) {
//display object details
} else {
//need to recover from corrupt data
}