下面写了两个方法:
我个人喜欢这种方法,因为它只是 IMO 的天才,你可以从我的详细解释中看出为什么我对这种方法如此兴奋。这种方法已经写在 Marcus Zarra 的核心数据第二版书中。它是一种自动渐进式迁移过程的实现,适用于重度和轻量级使用。
在 OP 询问是否有办法避免每次迁移升级都必须使用映射模型后,我提出了一种可能实现的方法
方法一
这就是渐进式迁移的用武之地。您为每个版本升级创建映射模型,这将在两个模型版本之间进行处理。映射模型将告诉迁移管理器如何将旧版本的数据存储映射到新版本的数据存储。所以映射模型需要source 和destination。
然后,您将拥有涵盖所有版本升级增量所需的尽可能多的映射模型。因此,如果您有 4 个版本,您将拥有 3 个映射模型,这将有助于在每个版本升级之间进行转换。最后你会得到他们的名字:V1toV2MappingModel,V2to3MappingModel,V3toV4MappingModel。
然后,您可以在每个映射模型中切换选项,让迁移管理员知道您希望如何迁移。无论是通过自定义策略还是正常的副本迁移。因此,您说对于 v1 到 v2,您需要轻量级迁移,只需选择适当的映射模型,然后使用模型/映射编辑器在旧属性到新属性之间建立所需的连接/映射,如果需要自定义迁移,然后转到正确的映射模型,选择您希望为其自定义迁移的产品实体映射,然后在 entitymapping 检查器中,您将看到您可以应用自定义迁移策略,只需复制您的迁移名称政策说例如MigrationPolicyV2toV3,因为它是您想要自定义的特定版本。
所以在上图中,您可以在左侧的映射模型名称中看到它适用于版本 1 到版本 2。请注意,ProductToProduct 实体映射的属性映射为空 - 在中间.这是因为如果您在entity mapping 检查器中查看图像的右侧,其中显示Custom Policy,我已经输入了我的迁移策略的名称。然后,这让迁移管理器知道(在迁移过程中)如何将属性和值从源映射到目标 - 版本 1 到版本 2 - 由于输入的迁移策略,它知道这一点。这也会导致值type 更改为自定义。让您知道当涉及到 ProductToProduct 实体映射时,它将是一个自定义迁移。
然后,您必须在迁移策略中定义,这将确定您希望如何复制这些值。这是您进行自定义操作的地方。
从上图中可以看出,它是我为ProductToProduct 实体映射设置的自定义迁移策略。你会注意到我实际上并没有做任何自定义,所有这一切都可以在没有迁移策略的情况下完成,并且可以通过调整entityMapping inspector 中的一些值来简单地进行复制迁移(轻量级迁移)和调整之前图像中的Attribute mapping 值。我只是将所有这些迁移政策自定义内容作为练习,以便我可以学习并为未来做好准备,以防万一我需要进行大量迁移。最好现在学习它,而不是以后嘿;)
这就是做定制的东西。我建议您阅读以下apple developer reference on NSEntityMigrationPolicy 以及执行更多自定义操作所需的方法,以便您知道在特定版本升级需要部分或完全自定义迁移时如何在整个迁移过程中进行完全控制。
对于任何自定义/重量级迁移 - 在我的情况下,我使用 migration policy 以便我可以在我的数据存储中从 V2 迁移到 V3 期间执行一些自定义代码的东西 - 然后你创建一个称为“迁移”的东西策略”,以便该映射模型将遵守您指定的自定义迁移规则。
您只需为每个映射模型应用所有适当的转换/映射,以便迁移管理器知道如何从一个存储升级到下一个存储。
您只需要一些递归代码,它会查看现有商店的元数据以确定它是否与最新版本兼容,如果不兼容,它将自动为您执行递归迁移,遵循每个映射模型的规则,因为它通过版本升级,直到商店与当前版本保持同步。
因此,您可以通过这种方式为所有用户提供任何版本,并让他们快速了解当前版本的商店。因此,如果用户处于版本 1,它将递归地从 V1 转到 V2,然后一直迁移到 v3 直到您当前的版本。如果用户有任何其他版本,这同样适用。
这确实意味着迁移过程需要更长的时间,但这是迁移所有用户的好方法,无论他们拥有哪个版本。
要找到这个渐进式迁移代码,你需要阅读一本名为Core Data 2nd Edition - Data storage and management for iOS, OS X, and iCloud 的书,第 3 章Versioning and Migration 子章3.6 Progressive Data Migration (An Academic Exercise) 来自页面54 to 59。
他通过代码与您交谈,并逐步告诉您如何编写progressivelyMigrateURL:ofType:toModel:error:方法。与他一起编写方法后,他会告诉您如何在应用程序启动时调用此方法,以便您的用户也可以逐步自动迁移他们的商店。
所以你应该先写方法,然后按照我上面的步骤,或者你可以阅读之前的子章节中的迁移策略。
在过去的 48 小时内,我几乎学会了所有这些,现在已经全部启动并运行。能够为某些版本进行轻量级迁移,然后为我的其他版本自动完成自定义迁移。
方法 2 - 另一种解决方案 尽管 IMO 更麻烦:您始终可以使用轻量级迁移设置,但显然您可以通过轻量级迁移实现甚至复杂的情况。但是在特定版本升级需要大量迁移的情况下,您始终可以执行 if 语句来检查当前存储,并且当且仅当持久存储的当前版本与需要大量迁移的升级匹配时,然后,您告诉迁移管理器执行大量迁移并遵循仅针对该实例的迁移策略的映射模型,然后如果要进行更多版本升级以使持久存储到最新的模型版本,则恢复轻量级迁移.