swift 2个不同对象中相同类型嵌入对象的列表

nqwrtyyt  于 2023-02-21  发布在  Swift
关注(0)|答案(1)|浏览(101)

我在coredata中有一个关系模式,我正试图将其迁移到realm,但怀疑是否可以在这里建立相同的模式。

class GrandParent: Object {
    @Persisted(primaryKey: true) public var primaryId: ObjectId
    @Persisted public var name: String
    @Persisted public var dob: String
    @Persisted public var children: List<Parent>
    @Persisted public var grandChildren: List<Child>
}

class Parent: EmbeddedObject {
    @Persisted public var name: String
    @Persisted public var dob: String
    @Persisted public var children: List<Child>
    @Persisted(originProperty: "children") public var parents: LinkingObjects<GrandParent>
}

class Child: EmbeddedObject {
    @Persisted public var name: String
    @Persisted public var dob: String
    @Persisted(originProperty: "grandChildren") public var grandParents: LinkingObjects<GrandParent>
}

我使用了这种模式,这样我就不需要在每次想知道祖父母的孙子时都遍历Parent对象了。正如领域文档所述,'嵌入式对象作为嵌套数据存在于单个特定父对象中。'
是否可以在祖类和父类中都有子类列表?
1.如果可能,是否在删除祖父母或父父母时级联删除子列表?
1.如果是可能,什么是实现这种模式的正确方法?

vecaoik1

vecaoik11#

嵌入对象是父对象的“一部分”,不存在于该对象之外。
因此,对1)是,删除祖父母也会删除其列表中的父对象和子对象。
嵌入对象作为嵌套数据存在于单个特定父对象中。它继承其父对象的生命周期,不能作为独立的领域对象存在。如果父对象被删除或被新的嵌入对象示例覆盖,领域会自动删除嵌入对象。
领域对嵌入式对象使用级联删除删除删除领域对象时,该对象引用的所有嵌入式对象也将随之删除。
这里的一个潜在问题是,从祖父母列表属性来看,从孩子到他们的父母没有反向关系。换句话说,如果你有一个祖父母孙子,你将不知道他们的父母是谁。
需要记住的是,嵌入式对象不能单独查询;它们必须通过点标记法通过父对象来查询。2所以将LinkingObjects添加到一个嵌入对象中可能没有任何作用,因为无论如何你必须知道父对象才能到达那些对象。
我建议将Parent和Child对象设置为托管对象,并通过孙子的祖父-〉父对象访问孙子

class GrandParent: Object {
    @Persisted public var children: List<Parent>
}

class Parent: Object {
    @Persisted public var children: List<Child>
    @Persisted(originProperty: "children"( var parents: LinkingObjects<GrandParent>
}

class Child: Object {
    @Persisted(originProperty: "children") var parents: LinkingObjects<Parent>
}

您甚至可以考虑使用一个类来处理所有这些问题,类似于以下内容:

class Person: Object {
    @Persisted var type: PersonTypeEnum //grandparent, parent, child
    @Persisted public var children: List<Person>
}

相关问题