首页 > 解决方案 > 如何在 Core Data 中建模二叉树?

问题描述

我目前有一个具有两种关系的实体:leftChildrightChild

Node:
    leftChild: Node (no inverse)
    rightChild: Node (no inverse)

现在我希望每个节点都有一个parent, 并将其设置为两个孩子的倒数:

Node:
    leftChild: Node (`parent` is inverse)
    rightChild: Node (`parent` is inverse)
    parent: Node

问题是,Core Data 似乎不喜欢有parent两个关系的逆。但是当然 leftChild 和 rightChild 都将具有相同的父级。所以我最终得到了这个不满意的结果:

Node:
    leftChild: Node (`leftParent` is inverse)
    rightChild: Node (`rightParent` is inverse)
    leftParent: Node
    rightParent: Node

但是“leftParent”和“rightParent”没有意义,因为只有一个父母。有没有更好的方法来建模这个?

标签: iosswiftcore-data

解决方案


将父母与孩子的关系建模为模型,将孩子与父母的关系建模to-manyto-one

在此处输入图像描述 在此处输入图像描述

如果您的节点带有偏向感,例如,isLeft: Bool那么左右节点可以由过滤器或谓词产生。

extension Node {
    var leftNode: Node? {
        return (children as? Set<Node>)?
            .filter({ $0.isLeft })
            .first
    }

    var rightNode: Node? {
        return (children as? Set<Node>)?
            .filter({ !$0.isLeft })
            .first
    }
}

其他建议(例如为关系使用有序集)to-many 也可能更适合您的用例。


推荐阅读