我的应用程序中有一个使用UIManagedDocument的核心数据数据库,并在旧版本的顶部添加了一个新版本。
如果我在不改变旧实体的情况下添加新实体,则新版本没有问题。但是,一旦我向旧版本的现有实体添加了新属性。 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崩溃了
如果删除新添加的属性,请再次创建NSManagedObject。代码再没有问题。
任何暗示为什么会失败?任何想法将不胜感激。
答案 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的文件名。但在崩溃的时候看着堆栈: 它在调用UIManagedDocument的initWithFileURL调用managedObjectModel时崩溃了。在堆栈中更深层次,它似乎试图合并Bundle中存在的所有模型。也许,我猜这两个版本的模型被视为两个模型合并为一个,而不是两个版本 - 由于这两个版本似乎是Bundle中的两个独立文件。在尝试合并时,存在两个具有相同名称但属性不同的表会导致冲突,这就是它崩溃的原因。