2011-11-06 129 views
0

我知道在堆栈溢出中有很多关于核心数据迁移的问题,但我找不到解决方案。核心数据轻量级迁移属性重命名

我成功地通过在源模型中将名为“LastName”的属性重命名为目标模型中的“姓氏”来进行轻量级迁移。我一步一步做到这一点,它的工作原理除了“姓氏”列上的所有以前的数据现在都已丢失。新的重命名属性存在,我可以插入新的实体和新插入的实体的值是确定的。旧数据和旧属性存在问题。正如苹果文档所述,我将目标模型上新重命名属性的重命名标识符与XCode接口或源代码模型中的旧属性的名称相关联,或者通过代码进行操作。我关于重命名属性的数据总是丢失。

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

Thnxs,

回答

1

最近,我在那里,即使重命名标识符,数据丢失我的模型各版本之间的同样的问题。该模型从版本10跳到15(版本11和版本12之间发生变化),所以重命名标识符未被拔出,即使将它包含在更高版本中也是如此。我还遇到了如何处理该属性的任何后续更改的问题。

最后,在将持久性存储连接到应用程序之前,我将以下代码添加到App Delegate中的persistentStoreCoordinator方法的中间(这是Apple的占位代码的一部分,当您在添加Core Data的情况下设置新项目时)持久存储协调执行轻型迁移:

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

然后我用(CoreData how to detect new version of an app so I can update the model?)StackOverflow上这个问题,其中介绍了如何存储CFBundleVersion旁边的持久性存储。这样,如果您再次更新属性名称,则可以检查持久存储的当前版本,并知道该商店的最新版本,因此您可以即时选择正确的重命名标识符。