【问题标题】:NSPersistentStoreCoordinator has no persistent stores(Schema mismatch or migration failure) core data in ios iOSNSPersistentStoreCoordinator 在 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
  • 不小心,我编辑了实体属性的数据类型,没有创建新模型版本。

标签: ios objective-c core-data


【解决方案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 将模型文件重置为最后一次工作提交(或在您的系统中执行等效操作)。然后在新版本而不是旧版本中进行更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 2012-03-24
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多