你不仅可以这样做,从某种意义上说,这是你能做到这一点的唯一方法.从Apple文档中,"要创建版本化模型,请从正常模型开始......"
你的v1有一个普通的模型.只要您拥有该模型,并按照该教程中链接的步骤创建版本化模型,轻量级迁移将起作用 - 如果您的迁移满足通常的轻量级迁移要求.轻量级迁移发生在v2应用程序(或v1.1或其他任何版本)中.v1应用程序中的数据模型基本上没有相关性.Core Data需要的是发现新的v2应用程序具有与本地设备上的Core Data存储中的内容匹配的数据模型的副本,并且具有描述您希望如何存储数据的新数据模型从这一点开始.如果所需的更改满足轻量级迁移的要求,则会执行此操作.
那些要求是什么?从关于轻量级迁移的Apple文档:
要执行轻量级迁移,Core Data需要能够在运行时自行查找源和目标托管对象模型.(Core Data搜索由NSBundle的allBundles和allFrameworks方法返回的包.)然后,它必须分析对持久实体和属性的模式更改,并生成推断的映射模型.要使Core Data能够执行此操作,更改必须符合明显的迁移模式,例如:
•简单添加新属性
•非可选属性变为可选
•可选属性变为非可选属性,并定义默认值.如果重命名实体或属性,则可以将目标模型中的重命名标识符设置为源模型中相应属性或实体的名称.您通常使用Xcode数据建模工具(对于NSEntityDescription或NSPropertyDescription对象)设置重命名标识符.在Xcode中,重命名标识符位于详细信息窗格的"用户信息"窗格中,位于版本哈希修改器下方(请参阅Xcode工具中的"核心数据的浏览器视图").您还可以使用setRenamingIdentifier:在运行时设置标识符.例如,要处理
•将实体Car重命名为Automobile,
并将Car的color属性重命名为paintColor在加载目标数据模型之后,在尝试打开商店文件之前,您将包含以下代码:
Run Code Online (Sandbox Code Playgroud)NSEntityDescription *automobile = [[destinationModel entitiesByName] objectForKey:@"Automobile"]; [automobile setRenamingIdentifier:@"Car"]; NSPropertyDescription *paintColor = [[automobile attributesByName] objectForKey:@"paintColor"]; [paintColor setRenamingIdentifier:@"color"];
总之,你没有错过这艘船,现在利用Core Data的这些功能还为时不晚.:)要回答您的具体问题,您无需更改文档中列出的标准步骤.
稍后更新 根据您对另一个答案的评论的进一步想法,您说:
所以只是为了确认,我不必在XCode中回溯我的核心数据模型到它看起来像v1然后再版本呢?所以我可以在我的应用程序处于v2的位置创建第一个核心数据模型版本?
根据你在这里所说的,问题似乎与最初的问题不同.您的初始问题表明您已经发布了应用的v1,而没有明确添加版本化的模型.但是,此声明表示您已对应用程序的v2更改了核心数据模型,而无需先创建版本化数据模型.这是完全不同的事情.
如果是这种情况,那么你的工作就更难了.但是,您可以检索您需要的东西,假设您保留源代码的备份或在git等存储库中管理您的代码(我建议所有开发人员都这样做).如果您已经更改了v2的核心数据模型,那么您需要做的是将当前数据模型转换为版本化模型,然后恢复/签出应用程序v1的副本,复制核心数据模型(*. xcdatamodel文件)从那里进入你当前的项目,这样你就拥有了v1数据模型和你的新模型.然后,您可能会使用轻量级迁移,如上所述.
请注意,此处的关键问题是您更改数据模型时.您的应用程序是否被称为v1或v2基本上与问题无关,除了显然可能是您在将版本号更改为应用程序的v2的同时引入了对数据模型的更改.