实体如何在递归模型结构中继承属性?

时间:2018-04-11 10:17:13

标签: ios core-data recursive-datastructures

我的结构与此帖相同: How do I create a recursive one-to-many relationship using core data?

它看起来像这样:

    cage ---------- animal 1
             |
             |_____ animal 2
             |
             |_____ animal 3 ____ animal 4
                              |
                              |__ animal 5
                                      |
                                      |_____ animal 6

我完全按照正确答案的方式实施了我的模型,即

enter image description here

对我而言,问题在于,使用此结构时,只有animal 1具有非零属性cage,但我希望所有后代动物都拥有此属性cage,以便我可以查询笼属性animal6.cage

我已尝试手动设置此项,但反向关系会导致任何具有笼子属性的动物成为该笼子的直接孩子,这是我不想要的。

是否可以为每只动物继承笼子属性?

1 个答案:

答案 0 :(得分:1)

您正在使用对“核心数据”没有意义的方式使用“inherit”和“child”等术语。您有CageAnimal相关。 Animal与自己有关系。

就核心数据而言,这里没有父/子关系或继承。如果一个Animal与另一个cage相关,那么它们只是两个有关系的实例。一个人不能从另一个继承值,因为在核心数据使用的任何意义上,它都不是“父”。这两个实例是两个独立的对象,它们不会继承任何两个非核心数据对象。

在此之后,设置Animal属性不会使cage成为笼子的“直接孩子”,它只是说它与笼子有关。如果您想在任何Animal找到cage而不在每个实例上设置func cage(for animal:Animal) -> Cage { var currentAnimal = animal var cage = currentAnimal.cage while cage == nil && currentAnimal.parent != nil { currentAnimal = currentAnimal.parent cage = currentAnimal.cage } return cage } ,那么您需要执行类似(Swift-ish伪代码)的操作:

Animal

如果您只是想为动物找到笼子,那就没关系了,但您不能在获取请求中使用它。如果您需要在提取时可以使用的内容,则可能需要添加从CageAnimal的第二个关系,以便您可以将“父”动物与其他动物区分开来。每个GROUP BY都有一个关系的值,另一个关系将保留给父关系。