核心数据轻量级迁移属性重命名

时间:2011-11-06 15:25:37

标签: iphone objective-c core-data core-data-migration

我知道Stack Overflow中有很多关于Core Data Migration的问题,但我找不到解决问题的方法。

我通过将源模型中名为“LastName”的属性重命名为目标模型中的“Lastname”,成功完成了轻量级迁移。我一步一步地实现了这个目标,除了现在“Lastname”列上的所有先前数据都丢失之外,它才有效。新的重命名属性存在,我可以插入新的实体,新插入的实体的值是可以的。问题在于旧数据和旧属性。正如Apple文档所述,我将目标模型上新重命名属性的重命名标识符通过XCode接口或代码放入源模型中的旧属性名称,并且无效。我重命名属性的数据总是丢失。

这是预期还是错过了什么?

Thnxs,

1 个答案:

答案 0 :(得分:1)

我最近遇到了同样的问题,即使使用重命名标识符,我的模型版本之间的数据也会丢失。该模型从版本10跳到15(版本11和12之间发生了更改),因此重命名标识符没有被拉出,即使我将其包含在更高版本中也是如此。我还遇到了如何处理属性的任何后续更改的问题。

最后,我将以下代码添加到App Delegate中的persistentStoreCoordinator方法的中间(在设置添加了Core Data的新项目时,它是Apple的占位符代码的一部分),然后将持久存储连接到持久性存储协调器,用于执行轻量级迁移:

NSEntityDescription *entity = [[[self managedObjectModel] entitiesByName] objectForKey:@"EntityName"];
NSPropertyDescription *property = [[entity attributesByName] objectForKey:@"NewAttributeName"];
[property setRenamingIdentifier:@"OldAttributeName"];

然后我在StackOverflow(CoreData how to detect new version of an app so I can update the model?)上使用了这个问题,它描述了如何将CFBundleVersion与持久存储一起存储。这样,如果再次更新属性的名称,您可以检查持久存储的当前版本,并且您知道商店的最新版本,因此您可以动态选择正确的重命名标识符。