如何重构核心数据模型以使两个现有实体从新的抽象实体继承

Chr*_*ker 12 migration iphone cocoa core-data ios

有了这个版本的iPhone应用程序,我正在尝试创建一个新的核心数据模型版本,其中我正在使用两个现有实体并将其更改为从一个全新的抽象实体继承.我还试图将这些实体中的几个共享属性移动到新的抽象实体上.

当我在应用程序的现有版本上运行时,我得到了一个 NSInternalInconsistencyException

Cannot merge multiple root entity source tables into one destination entity root table
Run Code Online (Sandbox Code Playgroud)

直到这个版本的应用程序,我已经离开了"轻量级"迁移.这个例外意味着我需要创建一个映射模型吗?

Chr*_*ker 27

我已经解决了这个问题.我将在这里详述,以便其他人可以将其用作资源.我不完全确定核心数据的内部工作原理,但在尝试创建一个新的抽象实体并将两个现有实体合并到其中时,它似乎会窒息.因此,我提出的解决方案是抛弃旧实体并创建3个全新实体并创建映射模型,以将旧实体中的数据映射到新实体.

给定以下需要从新抽象实体继承的实体.

  • Snake
  • Mouse

第1步 - 创建新的模型版本

创建新的模型版本并创建3个新实体.删除旧的.我为新实体使用了不同的名称.我不确定是否有办法通过保持名称相同来实现这一目标.

  • Serpent (取代蛇)
  • Rodent (替换鼠标)
  • Animal (另外两个将用作父母的新抽象实体)

注意:可以在模型设计器视图中复制和粘贴属性和关系.您可以在实体之间甚至跨模型版本复制它们.只需从设计器视图中的属性列表中选择属性,然后选择⌘-C即可.将属性从旧实体移动到新的实体上时,这可以节省大量时间.

第2步 - 创建映射模型

使用Xcode 创建映射模型.在创建对话框中,选择以前的模型版本作为源,将新模型版本作为目标.映射模型包含实体映射列表.Xcode应该为旧模型版本中的每个实体自动创建一个.它们遵循OldEntityToNewEntity的命名模式.所有新实体都尚未创建,因此您必须添加它们:

  • SnakeToSerpent
  • MouseToRodent

    (不要为抽象的Animal实体制作一个).

在每个新映射的属性检查器中,选择旧实体作为源,将新实体作为目标.

第3步 - 映射属性

应该已经存在每个实体映射中的一些属性和关系.应该已经自动检测并正确设置了旧实体和新实体中具有相同名称的任何属性.您必须为已移动到抽象实体的任何属性添加属性映射.(与关系和获取的属性相同)只需引用旧的模型版本,以确保包含计划继续使用的所有属性.

那应该是它.

  • 谢谢!我能够解决这个问题而无需删除旧实体.我实际上只是添加了一个映射模型到项目,选择旧模型,新模型,然后运行应用程序,它工作正常. (7认同)
  • 非常好!在制作新版本之后,我只需创建映射模型,就像serenn所说的那样.在将新父项添加到模型版本之后,除了更改现有实体的父实体之外,不对新模型进行任何更改. (2认同)