如果我已经发布的v1没有版本化的Core Data模型,我可以使用“自动轻量级迁移”吗?

时间:2011-09-21 09:09:25

标签: iphone ios core-data xcode4 migration

如果我已经发布的v1没有版本化的Core Data模型,我可以使用“自动轻量级迁移”吗?

如果是,是否有任何密钥更改为我需要应用的文档化步骤?

3 个答案:

答案 0 :(得分:6)

你不仅可以这样做,从某种意义上说,这是你能做到这一点的唯一方法。从Apple Documentation,“要创建版本化模型,您可以从正常模型开始......”

您的v1型号正常。只要您拥有该模型,并按照该教程中链接的步骤创建版本化模型,轻量级迁移将起作用 - 如果您的迁移符合通常的轻量级迁移要求。轻量级迁移发生在v2应用程序(或v1.1或其他任何版本)中。 v1应用程序中的数据模型基本上没有相关性。 Core Data需要的是发现新的v2应用程序具有与本地设备上的Core Data存储中的内容匹配的数据模型的副本,并且具有描述您希望如何存储数据的新数据模型从这一点开始。如果所需的更改符合轻量级迁移的要求,则可以执行此操作。

这些要求是什么?来自the Apple documentation on Lightweight Migration

  

要执行轻量级迁移,Core Data需要能够找到   源和目标托管对象在运行时自行建模。   (核心数据搜索NSBundle的allBundles和。返回的包   allFrameworks方法。)然后必须分析架构更改   持久化实体和属性,并生成推断映射   模型。要使Core Data能够执行此操作,更改必须适合   明显的迁移模式,例如:

     

•简单添加新属性
  •非可选属性成为可选属性
  •可选属性变为非可选属性,并定义一个   默认值。

     

如果您重命名实体或属性,则可以设置   将目标模型中的标识符重命名为   源模型中的相应属性或实体。你通常   使用Xcode数据建模工具设置重命名标识符(for   NSEntityDescription或NSPropertyDescription对象)。在   Xcode,重命名标识符位于Detail的User Info窗格中   窗格,在版本哈希修改器下面(请参阅Xcode中的浏览器视图)   核心数据工具)。您还可以使用在运行时设置标识符   setRenamingIdentifier :.例如,要处理

     

•将实体汽车重命名为汽车,
  •并重命名汽车的颜色   属性为paintColor

     

之后你会包含以下代码   加载目标数据模型,并在尝试打开之前   商店文件:

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的同时引入了对数据模型的更改。

答案 1 :(得分:3)

保存当前的非版本化模型文件(.xcdatamodel包)。

现在,创建一个新的模型版本。您将拥有一个.xcdatamodel包而不是.xcdatamodel文件。在Finder中右键单击它,选择"显示包内容"。这会将其作为目录打开 - 将旧的.xcdatamodel文件与新版本的.xcdatamodel包一起拖到该目录中。

现在,如果可能,自动迁移应该有效,您可能不需要映射模型。尽管测试确实!!!

我在生产应用程序中使用了这种方法,但确实有效。只要CoreData可以找到应用程序正在使用的当前模型,并且模型是应用程序依赖的模型的新版本,它就可以尝试自动迁移。

答案 2 :(得分:1)

是的,因为通过创建新版本,您还可以创建版本映射文件。该文件告诉应用程序哪些键将被更改为新版本中的哪些键(当然还有哪些键被删除和创建)

苹果文档:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmMappingOverview.html