核心数据重置

我正在重新设置coreData中的数据,下面是我的代码来重置CoreData中的数据

- (void) resetApplicationModel { __managedObjectContext = nil; __managedObjectModel = nil; __persistentStoreCoordinator = nil; _allPageViewController.controller = nil; NSError *error; NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"abc.sqlite"]; if ([[self.managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[self.managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error]) { // remove the file containing the data if([[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]) { //recreate the store like in the appDelegate method if([self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error] == nil) { NSLog( @"could not create new persistent store at %@ - %@", [storeURL absoluteString], [error localizedDescription]); } } else { NSLog( @"could not remove the store URL at %@ - %@", [storeURL absoluteString], [error localizedDescription]); } } else { NSLog( @"could not remove persistent store - %@", [error localizedDescription]); } } 

此代码正常工作,我的表中的所有数据被删除。 现在,当我尝试再次添加,我得到这个错误

 CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. attempt to insert row 3 into section 0, but there are only 0 rows in section 0 after the update with userInfo (null) 

我试图debugging这个问题,我才知道我的数据库是空的。 但我不明白为什么。 如果我没有重置运行应用程序,evrything工作正常。

所以请帮助我。

这是我关于FRC代表的代码

 - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { [m_tableView beginUpdates]; } - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { if (!m_userDrivenModelChange) { switch(type) { case NSFetchedResultsChangeInsert: [m_tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; break; case NSFetchedResultsChangeDelete: [m_tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; break; } } } - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { switch(type) { case NSFetchedResultsChangeInsert: [m_tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationLeft]; break; case NSFetchedResultsChangeDelete: [m_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; break; case NSFetchedResultsChangeMove: [m_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; [m_tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade]; break; } } - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { [m_tableView endUpdates]; } 

应用程序崩溃在[m_tableView endUpdates]行。

关心Ranjit

我不知道这是否是原因,但是在你设置之后

 __managedObjectContext = nil; __persistentStoreCoordinator = nil; 

你打电话

 if ([[self.managedObjectContext persistentStoreCoordinator] removePersistentStore: [[[self.managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error]) 

所以如果你有getter方法(如默认的xcode创build它们),你再次初始化它们,如果没有,那么你调用nil对象的方法。

编辑:试图解释(更好)

在你设置之后

 __managedObjectContext = nil; 

你打电话

 [self.managedObjectContext persistentStoreCoordinator] 

意思是

 [nil persistentStoreCoordinator] 

除非你有

 - (NSManagedObjectContext *)managedObjectContext 

在课堂上的方法。 如果您拥有该方法,则会再次为相同(旧)数据模型创buildmanagedObjectContext。

所以如果你想创build新的协调器,上下文…与新的模型文件,那么你需要设置它们为零后删除旧文件。