在新版本中添加现有实体的新属性时核心数据崩溃
Core Data crash when adding new Attribute of existing Entity in a new version
我的应用程序中有一个使用 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。代码再次运行没有问题。
有什么提示失败的原因吗?任何想法将不胜感激。
它正在崩溃,因为当它尝试创建文档时尚未设置选项。仅使用 init
创建文档,设置其 persistentStoreOptions
然后调用 configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:
接受这个问题的答案解决了这个问题。
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 中的两个独立文件。在尝试合并时,存在两个名称相同但属性不同的表导致冲突,这就是它崩溃的原因。
我的应用程序中有一个使用 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。代码再次运行没有问题。
有什么提示失败的原因吗?任何想法将不胜感激。
它正在崩溃,因为当它尝试创建文档时尚未设置选项。仅使用 init
创建文档,设置其 persistentStoreOptions
然后调用 configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:
接受这个问题的答案解决了这个问题。 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 的文件名。但是在它崩溃的时候查看堆栈: