NSPersistentStoreCoordinator 在 ios iOS 中没有持久存储(架构不匹配或迁移失败)核心数据
Posted
技术标签:
【中文标题】NSPersistentStoreCoordinator 在 ios iOS 中没有持久存储(架构不匹配或迁移失败)核心数据【英文标题】:NSPersistentStoreCoordinator has no persistent stores(Schema mismatch or migration failure) core data in ios iOS 【发布时间】:2017-04-07 13:29:26 【问题描述】:我添加了新版本的数据模型。我在新版本中添加了新字段。还将当前模型版本设置为新创建的版本。
代码更新:
- (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();
];
这是崩溃的截图:
当我通过从设备中删除早期应用程序进行安装时,它可以工作,但在现有版本上更新应用程序时会崩溃。
//如果我不小心在旧模型版本而不是新版本中添加了字段如何解决?
任何帮助将不胜感激。
【问题讨论】:
处理//Error
不小心,我编辑了实体属性的数据类型,没有创建新模型版本。
【参考方案1】:
请确保您已更新模型“当前版本”。 Update "Current Version" in .xcdatamodel -> File Inspector -> Model version
然后转到“AppDelegate.swift”文件并添加以下代码:
let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]
然后将“选项”应用到参数“选项”的以下代码:
try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: options)
代码将如下所示:
image
【讨论】:
【参考方案2】:由于您的模型更改,迁移失败。 Core Data 可以自动迁移——
简单添加新属性 删除属性 非可选属性变为可选 可选属性变为非可选属性并定义默认值 重命名实体或属性要确定 Core Data 是否可以执行自动迁移,请使用 NSMappingModel 的 inferredMappingModelForSourceModel:destinationModel:error:
方法。如果 Core Data 无法完成迁移,它将返回 nil。
当 Core Data 无法执行自动迁移时,您必须使用迁移管理器。 Apple 的文档提供了sample code 来解释如何使用迁移管理器。
【讨论】:
如果我没有迁移怎么办?我需要如何解决?【参考方案3】:如果我不小心在旧模型版本而不是新版本中添加了字段如何解决?
这样做可以解决您遇到的问题,以及删除应用程序并重新安装有效的事实。您要做的是返回并撤消该更改。希望您使用的是 git 或其他一些版本控制系统。如果是这样,请使用 git 将模型文件重置为最后一次工作提交(或在您的系统中执行等效操作)。然后在新版本而不是旧版本中进行更改。
【讨论】:
以上是关于NSPersistentStoreCoordinator 在 ios iOS 中没有持久存储(架构不匹配或迁移失败)核心数据的主要内容,如果未能解决你的问题,请参考以下文章