NSPersistentStoreCoordinator在ios iOS中没有永久存储(模式不匹配或迁移失败)核心数据

我已经添加了新版本的数据模型。 我在新版本中添加了新的字段。也将当前的型号版本设置为新创build的版本。

代码更新:

- (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil) { return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"PPUSFAModel" withExtension:@"momd"]; //I earlier was PPUSFAModel 16, i added new model version PPUSFAModel 17. _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:SQLITENAME]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { //Error } return _persistentStoreCoordinator; } 

它的工作,直到一些属性添加,但在一些点后,我在下面的代码崩溃

 - (void)saveContext { __block NSError *error = nil; NSManagedObjectContext *managedObjectContext = self.managedObjectContext; [managedObjectContext performBlockAndWait:^{ if (managedObjectContext != nil && _persistentStoreCoordinator != nil) { if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. // DLog(@"Unresolved error %@, %@", error, [error userInfo]); //abort(); } } }]; } 

这是崩溃的截图:

在这里输入图像说明

当我通过从设备删除早期的应用程序安装它的工作,但在应用程序更新现有版本时崩溃。

//如果我不小心添加了旧模型版本的字段而不是新版本如何解决这个问题?

任何帮助将不胜感激。

由于您的模型更改,迁移失败。 核心数据可以自动迁移 –

  • 简单的添加一个新的属性
  • 删除一个属性
  • 非可选属性变为可选
  • 可选属性变为非可选属性,并定义一个默认值
  • 重命名实体或属性

要确定Core Data是否可以执行自动迁移,请使用NSMappingModel的inferredMappingModelForSourceModel inferredMappingModelForSourceModel:destinationModel:error:方法。 如果Core Data无法完成迁移,将返回nil。

当核心数据无法执行自动迁移时,您必须使用迁移pipe理器。 Apple的文档提供了示例代码来解释如何使用迁移pipe理器。

如果我不小心添加旧模型版本的领域而不是新版本如何解决这个问题?

这样做会解决你看到的问题,并删除应用程序,重新安装工程。 你所做的是回去撤消这个变化。 希望你使用git或其他版本控制系统。 如果是这样,请使用git将模型文件重置为上次工作提交(或者在系统中执行相同的操作)。 然后在新版本中进行更改,而不是旧版本。