我已阅读有关核心数据模型自动/轻量级迁移的文档 - 但我在实现它时遇到问题。
据我了解,应用程序应该注意到它拥有的模型和设备上已经存在的模型不相同。如果您仅添加了属性或关系以及类似的简单更改,那么模型应该会自动升级。
任何指示 - 我需要在 Xcode 中设置某些内容吗?
最佳答案
我现在发现这非常简单 - 一旦你知道去哪里寻找。
在我的 AppDelegate 中,我设置了 NSPercientStoreCoordinator - 您需要向其添加一些选项以告诉它处理自动迁移:
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSError *error;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
// Handle error
NSLog(@"Problem with PersistentStoreCoordinator: %@",error);
}
那么你需要在 xCode 中做一些小技巧:
- 选择您的 xcdatamodel 文件
- 选择顶部的“设计”菜单 - 然后选择“数据模型” - 然后选择“添加模型版本”
- 然后,您的 xcdatamodel 文件将被移动到一个与您的 xcdatamodel 文件同名但扩展名为 xcdatamodeld 的新目录中 - 该目录中将有第二个文件,名称中带有 2。选择新文件,然后选择“设计”->“数据模型”->“设置当前版本”( in Xcode 4 you do this )
- 如果您已经进行了导致项目不兼容的更改,请从原始 xcdatamodel 文件中删除这些更改。如果您尚未进行更改 - 那么只需编辑 2.xcdatamodel 文件(您刚刚创建的当前版本)。
- 现在,当您将此版本安装到具有旧型号的设备上时 - 它会自动将该型号升级到新型号。
这看起来很棒并且像我想要的一样简单 - 但我认为您在开发过程中更改模型时需要小心 - 否则您将必须为每次更改创建一个新版本。
我认为我要做的是保留所有更改的文件,然后一旦准备好部署更新,我将删除所有中间文件并仅使用最旧和最新的模型进行部署。
<小时/>更新(2011 年 7 月 15 日):
感谢@rockstarberlin指出苹果有更新的文档:
Xcode 4: Setting a Managed Object Model’s Current Version
更新:2013 年 8 月 19 日更好的链接:
关于core-data - 我需要做什么才能让 Core Data 自动迁移模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1018155/