核心数据迁移 - 我们可以在 xcode 中有多个 .xcmapingmodel 文件吗?
Posted
技术标签:
【中文标题】核心数据迁移 - 我们可以在 xcode 中有多个 .xcmapingmodel 文件吗?【英文标题】:core data Migration - Can we have mutiple .xcmappingmodel files in xcode? 【发布时间】:2014-01-29 09:57:40 【问题描述】:我一直在为我的应用程序使用 Core Data,并升级了很多次(10-11 次),但用户现在抱怨应用程序后存储在核心数据数据库中的数据丢失了 上渐变。
以前,在发布新版本后,我正在从旧版本创建新模型版本并使用相同的模型并在需要时进行更改。在发布之前,我正在更新我的 .xcmappingmodel 模型。
现在我已经为下一个版本做好了准备,我有几个问题:-
1) 我们可以在 xcode 中有多个 .xcmappingmodel 文件吗? 2)我们是否需要手动执行从模型到模型的数据传输。示例:- 模型版本 1.0 到 1.1 、 1.1 到 1.2 、 1.2 到 1.3 以及很快。
假设任何应用程序用户没有升级并使用旧版本的应用程序(比如说 1.0),现在我已准备好发布 3.0。我们是否需要提供逐步迁移的功能?
示例:- 1.0 到 1.1 、1.1 到 1.2 以及很快到 3.0 或者他的数据库将自动升级到新版本并保留以前存储的数据。
非常感谢任何有关如何处理这种情况的建议。
提前致谢。
【问题讨论】:
【参考方案1】:是的,对于数据模型版本中的每个步骤,您不仅可以而且需要多个映射模型。所以一个用于 1.0 到 1.1。一个用于 1.1 到 1.2
这样,商店协调员可以将旧型号 1.0 升级到例如新型号 3.0。您需要告诉商店协调员进行更新。这叫做迁移。
例如:https://developer.apple.com/library/ios/documentation/cocoa/reference/CoreDataFramework/Classes/NSPersistentStoreCoordinator_Class/NSPersistentStoreCoordinator.html#//apple_ref/occ/instm/NSPersistentStoreCoordinator/addPersistentStoreWithType:configuration:URL:options:error:
更多CoreData迁移信息https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html
【讨论】:
你的意思是每个数据模型版本都需要映射模型? 是的。但是,如果模型之间的变化很小,商店协调员也可以在没有模型的情况下进行迁移。可以从模型描述中自动推断出某些类型的更改。请参阅上面的第二个链接。 在这种情况下,我们将有无限期的号码。 xocde 中的映射模型。迁移过程是否在后台自动处理?假设应用用户当前使用的是 1.0 版本,升级到 3.0 后,核心数据迁移是否会通过仅映射模型和版本自动完成? 是的,它会自动发生。不,不是不确定的映射模型,而是数据模型的数量 - 1.阅读我原始答案中的第二个链接以了解有关迁移的更多信息。强烈推荐。 感谢您的快速回复。我的应用中有 13 个(数量).xcdatamodel 模型【参考方案2】:当您有多个模型时,Core Data 不会自动支持渐进式迁移。例如,您有模型版本 1、2 和 3。该应用程序使用版本 1 创建了一个持久存储。较新版本的应用程序与模型的版本 3 一起安装。 Core Data 不会自动从版本 1 到版本 2 再到版本 3 顺序更新存储。无论您使用的是轻量级迁移,还是使用普通的重度迁移。
最轻量级的迁移当然是轻量级迁移。您应该尝试使用它,直到由于某种原因无法使用为止。它在内存上更快,更容易。
在进行轻量级迁移时,Core Data 必须从用于创建正在打开的商店的模型到应用程序中当前使用的模型推断映射模型。在我们的示例中,这意味着必须可以推断出从版本 1 到版本 2、从 1 到 3 以及从 2 到 3 的映射模型。
如果由于某种原因无法使用轻量级迁移,并且您正在创建映射模型并使用迁移管理器,它仍然不会为您自动执行渐进式迁移。所以你有从 1 到 2 和从 2 到 3 的映射模型。应用程序启动,商店以前使用版本 1 创建,当前版本是版本 3。你需要指定迁移管理器模型 1,模型 3,以及从 1 到 3 的映射模型。
当然,这完全是疯了。无法在源模型和目标模型的所有组合之间建立映射模型。解决方案是编写您自己的代码来控制渐进式迁移过程。代码基本上会打开现有的商店,找到它的映射模型,将商店迁移到下一个版本,然后重复。
您可以在 Marcus Zarra 的核心数据一书中找到一个很好的示例。
【讨论】:
以上是关于核心数据迁移 - 我们可以在 xcode 中有多个 .xcmapingmodel 文件吗?的主要内容,如果未能解决你的问题,请参考以下文章