在新版本

时间:2017-02-14 14:47:24

标签: ios core-data uimanageddocument

我的应用程序中有一个使用UIManagedDocument的核心数据数据库,并在旧版本的顶部添加了一个新版本。

enter image description here

如果我在不改变旧实体的情况下添加新实体,则新版本没有问题。但是,一旦我向旧版本的现有实体添加了新属性。 UIManagedDocument在调用initWithFileURL时崩溃了。这是我创建UIManagedDocument的方法。

UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:databaseURL];
self.databaseDocument = document;


NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
self.databaseDocument.persistentStoreOptions = options;

似乎在initWithFileURL时调用的modelByMergingModels崩溃了 enter image description here

我知道这是由于异常断点而崩溃的代码行。 enter image description here

如果删除新添加的属性,请再次创建NSManagedObject。代码再没有问题。

任何暗示为什么会失败?任何想法将不胜感激。

2 个答案:

答案 0 :(得分:0)

崩溃是因为当它尝试创建文档时尚未设置选项。仅使用init创建文档,设置其persistentStoreOptions,然后调用configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:

答案 1 :(得分:0)

这个问题的接受答案解决了这个问题。 UIManagedDocument migrate data model

- (NSManagedObjectModel *)managedObjectModel{
      NSString *path = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"];
      NSURL *momURL = [NSURL fileURLWithPath:path];
      NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

      return managedObjectModel;
}

我真的不知道为什么必须告诉它NSManagedObjectModel的文件名。但在崩溃的时候看着堆栈:enter image description here 它在调用UIManagedDocument的initWithFileURL调用managedObjectModel时崩溃了。在堆栈中更深层次,它似乎试图合并Bundle中存在的所有模型。也许,我猜这两个版本的模型被视为两个模型合并为一个,而不是两个版本 - 由于这两个版本似乎是Bundle中的两个独立文件。在尝试合并时,存在两个具有相同名称但属性不同的表会导致冲突,这就是它崩溃的原因。