如果我的已发行v1版本没有版本化的核心数据模型,我可以使用“自动轻量级迁移”吗?

如果我的已发行v1版本没有版本化的核心数据模型,我可以使用“自动轻量级迁移”吗?

如果是的话,是否有任何关键改变到我需要申请的文件化步骤?

你不仅可以做到这一点,从某种意义上说,这是你做到这一点的唯一方法。 从Apple文档 “创build一个版本化的模型,你从一个普通的模型开始……”

你的v1有一个正常的模型。 只要您拥有该模型,并且按照本教程中链接的步骤创build版本化模型,轻量级迁移将可以工作 – 如果您的迁移满足通常的轻量级迁移要求。 轻量级迁移发生在您的V2应用程序(或V1.1或其他)。 在你的v1应用程序中的数据模型基本上没有相关性。 核心数据需要的是发现新的v2应用程序有一个与本地设备上的Core Data存储库中的数据模型相匹配的数据模型副本,并且有一个新的数据模型,用于描述您希望如何存储数据从这一点出发。 如果所需的更改符合轻量级迁移的要求,则会执行此操作。

这些要求是什么? 从轻量级迁移的Apple文档 :

要执行轻量级迁移,Core Data需要能够在运行时自己find源和目标pipe理对象模型。 (核心数据search由NSBundle的allBundles和allFrameworks方法返回的包)。然后,它必须分析对持久化实体和属性的模式更改,并生成推断的映射模型。 对于核心数据能够做到这一点,这些变化必须适合一个明显的迁移模式,例如:

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

如果您重命名实体或属性,则可以将目标模型中的重命名标识符设置为源模型中相应属性或实体的名称。 您通常使用Xcode数据build模工具(对于NSEntityDescription或NSPropertyDescription对象)设置重命名标识符。 在Xcode中,重命名标识符位于详细信息窗格的“用户信息”窗格中,位于版本哈希修饰符的下方(请参阅Xcode工具中的核心数据的浏览器视图)。 您也可以使用setRenamingIdentifier:在运行时设置标识符。 例如,处理

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

加载目标数据模型后,在尝试打开存储文件之前,您将包含以下代码:

NSEntityDescription *automobile = [[destinationModel entitiesByName] objectForKey:@"Automobile"]; [automobile setRenamingIdentifier:@"Car"]; NSPropertyDescription *paintColor = [[automobile attributesByName] objectForKey:@"paintColor"]; [paintColor setRenamingIdentifier:@"color"]; 

总之,你没有错过这个机会,利用Core Data的这些function还为时不晚。 :)为了回答您的具体问题,您不需要从文档中列出的标准步骤进行更改。

稍后更新根据您对另一个答案的评论的进一步想法,您在哪里说:

所以只需确认一下,我不必在XCode中追踪我的核心数据模型,看起来像v1,然后版本呢? 那么我可以在我的应用程序在v2上创build第一个核心数据模型版本?

从你在这里说的话来看,这个问题似乎与最初的问题不同。 你最初的问题是你已经发布了你的应用程序的v1,而没有明确地添加一个版本化的模型。 但是,此声明意味着您已经对应用程序的v2的核心数据模型进行了更改,而无需先创build版本化的数据模型。 这是完全不同的事情。

如果是这样,那么你的工作就更困难了。 但是,您可以假设您保留源代码的备份或在git等存储库中pipe理代码(并build议所有开发人员同时执行这两个操作)来检索所需内容。 如果您已经更改了v2的核心数据模型,那么您需要做的是将当前的数据模型转换为版本模型,然后恢复/签出应用程序v1的副本,复制核心数据模型(*)。 xcdatamodel文件)从那里到你当前的项目,这样你就有了v1数据模型和新的数据模型。 那么您将可能使用轻量级迁移,如上所述。

请注意,这里的关键问题是您更改数据模型的时间。 无论您的应用程序是v1还是v2,都与问题基本无关,除非您明显可以在将应用程序的版本号更改为v2的同时,将更改引入到数据模型中。

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

现在,创build一个新的模型版本。 您将拥有一个.xcdatamodel包,一个.xcdatamodeld文件。 在Finder中右键单击它,select“显示包内容”。 将其作为目录打开 – 将旧的.xcdatamodel文件拖放到新版本的.xcdatamodel包中。

现在,如果可能的话,自动迁移应该工作,你可能不需要映射模型。 testing确定虽然!

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

是的,这是可能的,因为通过创build新版本,你也可以创build一个版本映射文件。 该文件告诉应用程序哪些键将被更改为新版本中的哪些键(以及哪些键被删除并创build)

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