实体如何继承递归模型结构中的属性?
Posted
技术标签:
【中文标题】实体如何继承递归模型结构中的属性?【英文标题】:How can an entity inherit a property in a recursive model structure? 【发布时间】:2018-04-11 10:17:13 【问题描述】:我在这里有一个与这篇文章相同的结构: 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
我已经完全按照正确答案实现了我的模型,即
对我来说问题是,在这种结构下,只有animal 1
有一个非零属性cage
,但我希望所有后代动物都拥有这个属性cage
,这样我就可以查询笼子属性animal6.cage
.
我尝试过手动设置,但反向关系会导致任何具有笼子属性的动物成为该笼子的直接孩子,这是我不想要的。
是否可以为每只动物继承笼子属性?
【问题讨论】:
【参考方案1】:您以对 Core Data 没有意义的方式使用诸如“继承”和“孩子”之类的术语。您拥有与Animal
相关的Cage
。 Animal
与自己有关系。
就核心数据而言,这里没有父/子关系或继承。如果一个Animal
与另一个相关,它们只是具有关系的两个实例。一个不能从另一个继承一个值,因为在 Core Data 使用的任何意义上,一个都不是“父级”。这两个实例是两个独立的对象,它们不会继承任何两个非核心数据对象所继承的任何东西。
因此,设置cage
属性不会使Animal
成为笼子的“直接子代”,它只是说它与笼子有关。如果您想为任意Animal
找到cage
,而不在每个实例上设置cage
,您需要执行类似(Swift-ish 伪代码)的操作:
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
如果您只想为动物找到笼子,这很好,但您不能在获取请求中使用它。如果您需要在获取时可以使用的东西,您可能需要添加第二个从 Animal
到 Cage
的关系,以便您可以将“父”动物与任何其他动物区分开来。每个Animal
都会有一个关系的值,而另一个关系将保留给父关系。
【讨论】:
我想我可以做一些类似你发布的功能的事情——虽然不知道你最后一段的意思 如果你想做一些事情,比如在一个特定的笼子里取每只动物,不管它们的父母/孩子状态如何,你不能在答案中使用这个方法——你需要一种不同的方法.如果您不需要这样做,那么该功能就是您所需要的。以上是关于实体如何继承递归模型结构中的属性?的主要内容,如果未能解决你的问题,请参考以下文章