【问题标题】:How to perform CoreData model migration *only* to add constraint(s)如何执行 CoreData 模型迁移*仅*添加约束
【发布时间】:2019-10-09 15:02:09
【问题描述】:

我有一个相当大的 CoreData 数据库,其中包含大量重复项,我需要添加约束以避免将来出现重复项。

因此,我需要将现有模型迁移到具有约束条件的模型,该模型可能(或确切地说)会丢失一些重复项。

最好,我希望通过回调或其他方式控制过度重复删除过程。

在最坏的情况下,我可能会拥有 2 个 MOC 并一个一个地复制数据,但是这种迁移的好方法是什么?

现在我收到Domain=NSCocoaErrorDomain Code=134110 "An error occurred during persistent store migration." UserInfo={sourceURL=<...>, reason=Cannot migrate store in-place: constraint violation during attempted migration,

附:我意识到我的问题与下面的问题相似,但没有得到回答。我也尝试过轻量级迁移,但以类似的方式失败了。 Core Data: constraints changes required migration Issues while lightweight Core Data Migration

【问题讨论】:

    标签: ios swift core-data core-data-migration


    【解决方案1】:

    嗯,当您为这个问题命名时,您有点忽略了实际的标题。添加约束确实是微不足道的。但是,您的另一个要求,删除现有的重复项实际上是更重的提升。为此,您需要做一个Heavyweight Migration :)

    我花了几分钟寻找一个关于重量级迁移的好教程,但到目前为止,我只发现博客文章顺便提到它是要避免的,因为它很困难。我做过重量级迁移,不同意这很困难。其实很简单。

    首先,在 Xcode 中打开您的项目并通过克隆当前数据模型然后添加约束来创建新版本的数据模型。此步骤与执行轻量级迁移相同。接下来,单击菜单:File > New,然后向下滚动到 Core Data 并选择 Mapping Model。当然,这是我链接到的苹果文档中提到的NSMappingModel。当包含在您的应用程序目标中时,它会将.cdm 文件添加到您的应用程序产品的资源中。还会有一些代码要编写——NSMigrationPolicy 的子类。这将是您正在寻找的回调或其他东西。如果您在这些方面需要帮助,请告诉我们。

    【讨论】:

    • 迁移模型可以在代码中自动推断,不需要覆盖迁移策略。似乎为(推断的)迁移模型的所有实体定义自定义源表达式可以解决问题,但现在我被 stackoverflow.com/questions/56306232/… 问题所困扰。
    • 我糟糕的自定义源表达式方法预计会返回NSFetchRequest,而不是其结果,因此无法在那里过滤。所以确实过滤只能在.createDestinationInstances()自定义迁移策略的方法中完成。
    猜你喜欢
    • 2011-06-07
    • 2012-01-05
    • 2014-05-02
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2011-09-14
    • 2019-03-24
    相关资源
    最近更新 更多