Core data CoreData从一到多到多的迁移

Core data CoreData从一到多到多的迁移,core-data,many-to-many,one-to-many,Core Data,Many To Many,One To Many,我在将旧数据模型升级到当前模型时遇到问题。它有几层可能会导致问题,我正在努力确定问题所在 我有一个抽象的客户实体,它包含与电话号码、电子邮件地址等的一般关系。在我的旧模型中,客户可以拥有一处房产(但房产可以有许多所有者),或者客户可以是租约中的租户(但租约可以有许多租户)。我现在已经更新了模型,这样一个客户就可以拥有许多房产,成为许多租赁的一部分 具体的客户端实体基本上向摘要中添加了不同的命名信息,因此有个人、企业、政府和导入(从其他系统导入)子类 我的期望是,在旧数据模型中建立的一对多关系将作

我在将旧数据模型升级到当前模型时遇到问题。它有几层可能会导致问题,我正在努力确定问题所在

我有一个抽象的客户实体,它包含与电话号码、电子邮件地址等的一般关系。在我的旧模型中,客户可以拥有一处房产(但房产可以有许多所有者),或者客户可以是租约中的租户(但租约可以有许多租户)。我现在已经更新了模型,这样一个客户就可以拥有许多房产,成为许多租赁的一部分

具体的客户端实体基本上向摘要中添加了不同的命名信息,因此有个人、企业、政府和导入(从其他系统导入)子类

我的期望是,在旧数据模型中建立的一对多关系将作为第一个实例添加到新数据模型中的新多对多关系中。不幸的是,升级后的数据存储在新的具体客户机中似乎不包含任何关系

旧模式:

Client{
   Property<<-->Property.Owners
   Tenancy<<-->Lease.Tenants
}
ImportClient:Client{
   name:string
}
如果我尝试将映射添加到具体类中(因此ImportClientToImportClient),则似乎完全不可能正确设置关系值(基本上被编辑器拒绝)

因此,我的怀疑是,它要么无法传输关系,因为当对客户机实体运行fetch时,它什么也不返回(每当我尝试时,情况就是如此),要么就是没有正确地获取值表达式


非常感谢您的帮助,因为目前这是阻止我发布应用程序主要升级的唯一问题。

因此,我找到的解决方案(对于稍后偶然发现此问题的人…)一般来说,因为我目前没有时间在此处详细说明所有代码

步骤1:查看是否可以在不使用任何迁移选项的情况下打开数据存储。如果成功,则继续执行步骤2

步骤2:使用[NSPersistentStoreCoordinator metadataForPersistantStore…]检索存储元数据

步骤3:从最新到最旧,一次加载一个旧模型,并使用[NSManagedModel isConfiguration:compatibleWithStoreMetadata:]直到找到一个可以工作的模型

步骤4:使用有效的模型创建持久存储,然后从数据存储和持久存储创建托管对象上下文

步骤5:在字典中缓存失败的关系(我使用成对的UUID来标识对象)

步骤6:使用当前的托管对象模型执行数据存储的轻量级升级

步骤7:浏览字典,获取对象对并再次关联它们


是的,您必须使用自己的编码技能来实现这一点(我的示例中大约有250行代码),但希望这是使其工作所需的种子…

因此,我发现的解决方案(对于那些后来偶然发现这一点的人…)一般来说,因为我目前没有时间在这里详细介绍所有代码

步骤1:查看是否可以在不使用任何迁移选项的情况下打开数据存储。如果成功,则继续执行步骤2

步骤2:使用[NSPersistentStoreCoordinator metadataForPersistantStore…]检索存储元数据

步骤3:从最新到最旧,一次加载一个旧模型,并使用[NSManagedModel isConfiguration:compatibleWithStoreMetadata:]直到找到一个可以工作的模型

步骤4:使用有效的模型创建持久存储,然后从数据存储和持久存储创建托管对象上下文

步骤5:在字典中缓存失败的关系(我使用成对的UUID来标识对象)

步骤6:使用当前的托管对象模型执行数据存储的轻量级升级

步骤7:浏览字典,获取对象对并再次关联它们


是的,您将不得不使用自己的编码技能来实现这一点(我的示例中大约有250行代码),但希望这是您需要的种子,以使其正常工作……

您在一段中描述的新旧数据模型很难理解。您可能希望包括一个屏幕截图,或者以文本格式表示实体,正如我前面的回答中所使用的,我已经给了它一个截图。希望它现在变得更有意义?您很难理解段落中描述的新旧数据模型。您可能希望包括一个屏幕截图,或者以文本格式表示实体,正如我前面的回答中所使用的,我已经给了它一个截图。希望它现在更有意义?
Client{
  Properties<<-->>Property.Owners
  Tenancies<<-->>Lease.Tenants
}
ImportClient:Client{
  name:string
}
 FUNCTION($manager,"destinationInstancesForEntityMappingName:sourceInstances:","PropertyToProperty","$source.Property")