Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何组织具有循环依赖关系的核心数据实体?_Objective C_Ios_Cocoa Touch_Core Data_Circular Dependency - Fatal编程技术网

Objective c 如何组织具有循环依赖关系的核心数据实体?

Objective c 如何组织具有循环依赖关系的核心数据实体?,objective-c,ios,cocoa-touch,core-data,circular-dependency,Objective C,Ios,Cocoa Touch,Core Data,Circular Dependency,这是一个关于如何最好地组织核心数据中NSManagedObject之间关系的概念性问题 当存在循环依赖关系时,如何组织核心数据中的实体? 例如,假设我正在做一个社交食谱应用程序。此应用程序允许您根据谁制作每个食谱以及谁购买每个配料来组织膳食。此外,每个食谱都是由不同的人制作的。因此,我提出了以下NSManagedObjects及其各自的属性和关系: Chef=uniqueID(字符串)、用户名(字符串)、技能(字符串) >recipetomake=(对许多人)Recipe >ingredient

这是一个关于如何最好地组织核心数据中NSManagedObject之间关系的概念性问题

当存在循环依赖关系时,如何组织核心数据中的实体?

例如,假设我正在做一个社交食谱应用程序。此应用程序允许您根据谁制作每个食谱以及谁购买每个配料来组织膳食。此外,每个食谱都是由不同的人制作的。因此,我提出了以下NSManagedObjects及其各自的属性和关系:

Chef
=uniqueID(字符串)、用户名(字符串)、技能(字符串)
>
recipetomake=(对许多人)
Recipe

>
ingredientsToBuy=(对许多人)
成分

Recipe
=唯一标题(字符串)、作者(字符串)
>
成分=(对许多人)
成分

成分
=名称(字符串),卡路里(整数64)

问题

如果我有多个
Chef
处理同一配方,这是否意味着同一
recipe
对象的多个副本存储在核心数据中,每个副本都属于一个单独的
Chef
?如果是,可以吗?如果没有,当
Chef
本身可以通过
recipeTomake
指向多个
Recipe
对象时,如何在核心数据中创建一个
Recipe
对象并让多个
Chef
指向它

[[uuu]如果给我一份菜谱,我如何检查分配给它的是哪个
厨师
?我会在核心数据中提取那些指向具有给定
uniqueTitle
属性的
配方
对象的
Chef
对象吗

[\uuz]由于
Chef
对象可以指向许多
Recipe
对象,因此将每个
Recipe
的作者存储为包含作者唯一ID的
Recipe
上的属性是否正确?我最初会想创建一个从
Recipe
到一个
Chef
的关系,但这会在
Chef
Recipe
对象之间创建另一个循环依赖关系

再次,如果
Chef
可以通过
ingredientsToBuy
指向许多
配料
对象,并且
配方
可以通过
配料
指向许多
配料
对象,那么在CoreData中是否会有相同的
配料
对象的多个副本

如果我允许
Recipe
对象具有任意数量的作者,我将如何实现这一点?使用与
Chef
对象的关系似乎会创建循环依赖关系,而使用与
Chef
uniqueID
连接的属性似乎需要预先指定每个
配方
对象的最大作者数。

此处使用了术语“循环依赖关系”,但您在核心数据中真正指的是关系和反向关系,这实际上是推荐的

当您在构建一个类系统时,循环依赖是不需要的,这些类在两个方向上相互依赖太多,也称为耦合。它们确实不可取,但它更多地与代码流和逻辑有关,而不是在处理数据关系时

以下是您问题的答案:

  • 您有责任在代码中强制实现配方的唯一性,这意味着您必须定义使两个配方成为“相同”配方的质量。你甚至可以比较配方中的每一种成分,或者只需比较配方的唯一性就可以了。这样,您就可以实现“更新或创建”设计模式,首先通过主键查找配方,在更简单的场景中,主键是uniqueTitle。如果它已经存在,那么您可以简单地读取和/或更新该对象。否则,将其创建为新的托管对象。对它的后续查询将获取刚刚创建的对象。然后,每个厨师都可以与单个菜谱对象建立关系

  • 对于每一种关系,定义反向关系也是一种很好的做法。在Recipe对象中,将其称为“ChefsMaking”,这可能是指向Chef对象的对多关系。(它们结合在一起形成“多对多”关系)。在Xcode中,每个关系都有一个下拉框,您可以在其中设置其逆关系

  • 我相信有可能创建多个引用同一类型对象的关系。这里有两种类型的关系,从菜谱指向厨师。一种是“做支票”,一种多对多的关系。另一个是“Author”,一个对一关系,与之相反的是Chef对象中的对多“RecipesAuthored”关系

  • 答案1中的相同原则适用于此处。定义一种配料的唯一性,让你的厨师和食谱通过获取一种已经存在的配料(通过主键)或创建一种新的配料来指向该配料

  • 只需重命名您的关系作者,并使其成为多对多关系

  • 希望这有帮助

    这里使用的术语“循环依赖性”是负面的,但您在核心数据中真正指的是关系和反向关系,实际上是推荐的

    当您在构建一个类系统时,循环依赖是不需要的,这些类在两个方向上相互依赖太多,也称为耦合。它们确实不可取,但它更多地与代码流和逻辑有关,而不是在处理数据关系时

    以下是您问题的答案:

  • 您有责任强制执行Re的唯一性