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 中没有持久存储(架构不匹配或迁移失败)核心数据的主要内容,如果未能解决你的问题,请参考以下文章