从由两个单独的 xcdatamodel 文件定义的存储迁移时,我在执行轻量级迁移时遇到问题。
在我的应用程序 1.0 版中,我将模型分解为分析模型、模型 A 以及模型 B 中的所有其他内容。编译时,模型将组合在一起,一切顺利。
在开发新版本 1.1 时,我通过向模型 B 添加新模型版本并将该新版本设置为活动来升级模型 B。
从 1.0 升级到 1.1 时会出现此问题。似乎 Core Data 检查磁盘上的模型存储(由 1.0 版创建)并查找描述它的模型,但无法找到定义整个存储的 SINGLE 模型(模型 A 仅涵盖分析,模型 B 涵盖其他所有内容),因此它会引发“找不到源存储模型”错误。
有没有人找到一种解决方案来分离模型,但仍然允许升级 + 轻量级迁移工作,而无需定义自定义迁移的额外麻烦?
这是用于加载模型的代码片段:
NSArray *modelNames = [NSArray arrayWithObjects:@"model-A", @"model-B", nil];
NSMutableArray *models = [NSMutableArray array];
for (NSString *name in modelNames)
{
LogInfo(@"loading model %@", name);
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:name withExtension:@"momd"];
NSManagedObjectModel *model = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL] autorelease];
[models addObject:model];
}
// combine all the separate models into one big one
objectModel = [[NSManagedObjectModel modelByMergingModels:models] retain];
NSURL *documentsDirectory = [NSURL fileURLWithPath:[SuperFileManager documentsDirectory] isDirectory:YES];
NSURL *storeURL = [documentsDirectory URLByAppendingPathComponent:@"database.sqlite"];
NSError *error = nil;
coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:objectModel];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:options
error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}