如何*仅*执行 CoreData 模型迁移以添加约束

How to perform CoreData model migration *only* to add constraint(s)

我有一个相当大的 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,

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

好吧,您在给这个问题起标题时有点忽略了实际的标题。添加约束确实是微不足道的。但是,您的其他要求,删除现有的重复项实际上是更重的提升。为此,您需要执行 Heavyweight Migration :)

我花了几分钟时间寻找有关重量级迁移的优秀教程,但到目前为止,我只找到了一些博客文章,顺便提到它是因为它很困难而需要避免的事情。我做过重量级迁移,但不同意这很困难。其实很简单。

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