gpt4 book ai didi

ios - 核心数据-混合轻量级和自定义迁移

转载 作者:行者123 更新时间:2023-12-02 02:27:26 25 4
gpt4 key购买 nike

因此,我在App Store中拥有我的Core Data应用程序的版本1,现在我开始使用版本2。

我对数据库模型进行了一些小的更改,在完成这些更改以完成从版本1到版本2的升级后,我需要运行一些自定义代码。

我可以使用Core Data的轻量级迁移来处理模型更改,并且可以在迁移完成后运行我的自定义代码。

问题是,我不确定将来将何时构建版本3、4、5时会发生什么……

假设情况是这样的:
版本1到版本2-使用轻量级迁移
版本2到版本3-使用自定义迁移和模型映射
版本3到版本4-再次使用轻量级迁移
等等..

我不确定如何建立一种机制来处理轻量级和自定义迁移的混合问题。
我找不到在线或在Core Data文档中谈论此问题的任何代码,这意味着对于大多数Core Data应用而言,这是一个非常常见的问题,是否有针对此问题的最佳实践示例?

最佳答案

下面编写了两种方法:

  • 我个人喜欢这种方法,因为它只是IMO天才,您可以从我的解释细节中看出为什么我对这种方法如此兴奋。该方法已写在Marcus Zarra的核心数据第二版书中。它是针对大量使用和轻量使用的自动渐进迁移过程的一种实现。
  • 在OP询问是否有一种方法可以避免为每个迁移升级使用映射模型时,我想出了一种可能的实现方法

    方法1
    这就是渐进式迁移的用处。您可以为每个版本升级创建映射模型,这将在两个模型版本之间进行。映射模型将告诉迁移管理器如何将旧版本的数据存储映射到新版本的数据存储。因此,映射模型需要sourcedestination

    然后,您将具有所需的映射模型,这些模型将覆盖所有版本升级增量。因此,如果您有4个版本,则将拥有3个映射模型,这将有助于每个版本升级之间的过渡。最后,您将它们命名为:V1toV2MappingModelV2to3MappingModelV3toV4MappingModel

    然后,您可以在每个映射模型中切换选项,以使迁移管理器知道您希望如何迁移。通过自定义策略还是常规副本迁移。因此,您说对于v1到v2,您需要进行轻量级迁移,只需选择适当的映射模型,然后使用模型/映射编辑器在旧属性到新属性之间进行所需的连接/映射,如果需要进行自定义迁移,然后转到正确的映射模型,选择要为其定制迁移的产品实体映射,然后在entitymapping检查器中,您将看到可以应用定制迁移策略,只需复制迁移策略的名称说:例如MigrationPolicyV2toV3,因为它是您要自定义的特定版本。

    因此,在上面的图像中,您可以在映射模型的名称的左侧看到版本1到版本2。请注意,ProductToProduct实体映射的属性映射为空-中间。这是因为,如果您在entity mapping检查器中的图像右侧看到Custom Policy,则输入了迁移策略的名称。然后,这使迁移管理器知道(在迁移过程中)如何将属性和值从源映射到目标(版本1到版本2),并且由于输入了迁移策略,因此知道这一点。这也会导致将type值更改为custom。告诉您ProductToProduct实体映射将是自定义迁移。

    然后,您必须在迁移策略中定义,这将决定您希望如何复制值。在这里您可以进行自定义。

    从上图可以看到,它是我为ProductToProduct实体映射设置的自定义迁移策略。您会注意到,我实际上并没有进行任何自定义,所有这些操作都可以在没有迁移策略的情况下完成,并且可以通过调整entityMapping inspector中的一些值并调整图像中的Attribute mapping值。我只是作为练习练习了所有这些迁移策略自定义内容,因此我可以学习并为 future 做好准备,只是需要进行大量迁移而已。最好现在学习它,以后再说吧;)

    就是做定制的东西。我建议您阅读以下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页中阅读一本书,称为Versioning and Migration,第3章3.6 Progressive Data Migration (An Academic Exercise)子章节54 to 59

    他与您讨论该代码,并逐步告诉您如何编写progressivelyMigrateURL:ofType:toModel:error:方法。与他一起编写该方法后,他将告诉您如何在应用程序启动时调用此方法,以便您的用户也可以自动逐步迁移其商店。

    因此,您可能应该首先编写该方法,然后按照上面的步骤进行操作,否则您可以在子章节中通读迁移策略。

    在过去的48个小时中,我几乎学会了所有这些,并立即开始运行。能够对某些版本进行轻量级迁移,然后对我的其他版本进行自定义迁移,这些迁移都自动完成。

    方法2-另一个解决方案,尽管更麻烦IMO:始终可以考虑到轻量级迁移设置,因为您显然可以通过轻量级迁移实现复杂的情况。但是在特定版本升级需要大量迁移的情况下,您始终可以执行if语句来检查当前存储,并且如果且仅当持久性存储的当前版本与需要大量迁移的升级匹配时,才可以执行以下操作:然后,您告诉迁移管理器执行大量迁移,并遵循仅对该实例具有迁移策略的映射模型,然后如果要进行更多版本升级以将持久性存储库更新为最新模型版本,则继续轻量级迁移。 。

  • 关于ios - 核心数据-混合轻量级和自定义迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25285068/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com