Core data 如何将目标NSManagedObject添加到另一个具有反向多对多核心数据关系的NSManagedObject,而不复制目标NSManagedObject?

Core data 如何将目标NSManagedObject添加到另一个具有反向多对多核心数据关系的NSManagedObject,而不复制目标NSManagedObject?,core-data,nsfetchedresultscontroller,nsmanagedobject,nsmanagedobjectcontext,nsset,Core Data,Nsfetchedresultscontroller,Nsmanagedobject,Nsmanagedobjectcontext,Nsset,我在我的一个项目中遇到了一个问题,我花了十几个小时来寻找解决方案,我取得了一些进展,但仍然没有达到理想的目标。我现在仍在自己寻找解决方案,但我非常感谢任何人能够分享建设性解决方案的见解 问题: 如何将主列表中的目标NSManagedObject作为一个对象添加 另一个NSManagedObject中引用的 每个NSManagedObject之间的多对多关系 在主列表中创建重复的目标NSManagedObject 注意: 下面的示例使用了与完整数据模型图的类比 我真正的项目。这个类比是我最能

我在我的一个项目中遇到了一个问题,我花了十几个小时来寻找解决方案,我取得了一些进展,但仍然没有达到理想的目标。我现在仍在自己寻找解决方案,但我非常感谢任何人能够分享建设性解决方案的见解

问题:

  • 如何将主列表中的目标NSManagedObject作为一个对象添加 另一个NSManagedObject中引用的 每个NSManagedObject之间的多对多关系 在主列表中创建重复的目标NSManagedObject
注意:

  • 下面的示例使用了与完整数据模型图的类比 我真正的项目。这个类比是我最能描述这个问题的地方 我有,而类比中的对象并不完全相同 实际项目中对象的名称
我现在拥有的:

  • 成分对象的主列表,每个成分对象都是唯一的
    其他的

  • 配方对象的列表,每个对象都希望具有不同的 用于定义配方对象的配料对象

我想要实现什么:

  • 配料对象可以多次插入到单个配方对象中,每次插入都作为唯一计数,而不是将相同的配料作为单个计数

  • 我不想复制 主列表,以便能够将多个成分对象添加到每个 配方对象或交叉多个配方对象

我尝试过的:

  • 使用核心数据管理配料和配方,如图2所示 NSManagedObjects

  • 已在配料管理对象上创建了名为“allHostRecipes”的关系属性,并将其设置为与配方管理对象的“多对多”关系

  • 已在配方管理对象上创建了名为“AllusedComponents”的关系属性,并将其设置为与配料管理对象的“多对多”关系

  • 这两个关系设置为“反向”
  • 我有一个菜谱描述视图和一个表格视图,其中列出了菜谱中包含的所有成分
  • 我创建了另一个配料选择表视图,可以在“配方描述”视图中触发该视图,以选择将要添加到配方中的每个配料
  • 每次在配料选择表视图中选择配料时,我都会调用NSFetchedResultsController上的objectAtIndexPath(:),该控件用于配料主列表中的配料表视图,以在其ManagedObjectContext中查找所选配料对象
  • 然后,我将所选配料管理对象(SelectedIngredInManagedObject)传递回配方描述视图,并在NSFetchedResultsController上调用mutableSetValueForKey(“AllusedIncoments”).addObject(SelectedIngredInManagedObject),该控件用于获取配方对象中包含的配料

  • “用于配料主列表配料表视图的NSFetchedResultsController”和“用于提取配方对象中包含的配料的NSFetchedResultsController”是“配方说明视图的表视图”和“配料选择表视图”中的独立实例变量.但它们引用了相同的ManagedObjectContext

我现在得到的:

  • 可以将所选配料管理对象添加到配方中
  • 但是,如果我多次选择相同的成分,它只会在“配方描述”视图的表视图中获得一次计数,而不是通过每次插入显示多个计数,这不是我想要实现的,如上所述
我的问题:

  • 我应该做什么或调整以实现我所拥有的功能 如何描述上述内容?
我认为解决问题的方向是什么:

  • 在定义“多对多”时,我还应该做什么 核心数据模型中的关系
  • “多对多”引用使用NSSet这一事实是否会导致计数问题
  • 是否需要创建多个ManagedObjectContext以实现所需的功能
  • 我是否应该将选定的配料管理对象克隆为新的配料管理对象?我已经尝试过了,它会将重复的配料添加到配料主列表中。这也不是我想要的。如果我需要克隆它,我如何才能使其正确
我真的很感谢您抽出时间来观看,我期待着您的见解。非常感谢

问候,


Knight

您需要稍微重新构建数据:删除从
配方
成分
的多-多关系,并将其替换为一个中间实体(很难找到一个好的名称,比方说
ReceiveRedientDetails

创建一个从
Recipe
RecipeIngredientDetails
的一对多关系,比如说
allUsedIngredientDetails
,逆(对一)
Recipe

同样地,创建一个从
成分
RecipeIngredientDetails
的一对多关系,比如说
所有HostRecipeDetails
,与成分相反(对一)

这解决了直接多-多关系的问题,其中每个
配方
只能与每个
成分
关联一次。(您是正确的,这部分是关系被忽略的结果。)