领域链接对象和删除

Posted

技术标签:

【中文标题】领域链接对象和删除【英文标题】:Realm linking objects and deletions 【发布时间】:2017-05-02 11:07:18 【问题描述】:

在 Realm 中,如果我设置了 linkingOjbects 关系,我应该如何处理删除而不是留下孤儿,尤其是当它是多对多反向关系时?

使用 Realm Person 和 Dog 示例,假设此实例中的 Person 是 Dog walker,并且 Dog 可以在不同的日子由不同的 Person 遛

所以一个 Dog 对象被分配给多个 Person 对象。每个 Person 对象都可以看到 Dog。假设如下对象结构和数据

  Person : Object 
     dynamic var name:String = ""
     let dogs = List<Dog>()
  

  Dog : Object 
    dynamic var name: String = ""
    let walkers = LinkingObjects<fromType: Person.self, property:"dogs">
  


Person A
dogs = [Fido,Rover]

Person B
dogs = [Fido, Rover]

A 不再需要步行 Fido,正确的方法应该是

   personA.dogs.remove(objectAtIndex:idxOfFido) 

这会更新 personA 中的引用,但它也会更新 dog 中的引用吗?

其次,如果 personB 也不再需要走路 Fido 我会这样做

  personB.dogs.remove(objectAtIndex:idxOfFido)

但这是否会在我的 Dog 领域中留下对 Fido 的孤立引用,因为它不再由任何人行走?然后由我来做一个检查,比如

 if fido.walkers.count == 0 
     //remove Fido
 

【问题讨论】:

AFAIK 1.) 链接对象是“关系的另一端”,所以如果你在一侧更新它,那么另一端也会更新。从persons.dog 中删除fido 将从dog.walkers 中删除person。 2.) 狗没有被人遛过并不意味着它已经死了,所以是的,你需要手动删除孤儿狗。 @EpicPandaForce,这是准确的。我建议将您的评论移至答案。 Aaand 开始回答 :) 【参考方案1】:

1.) 链接对象是“关系的另一端”,所以如果你在一侧更新它,那么另一端也会更新。从persons.dog 中删除fido 将从dog.walkers 中删除person

2.) 狗没有被某人遛过并不意味着它已经死了,所以是的,您需要手动删除孤儿狗。

【讨论】:

以上是关于领域链接对象和删除的主要内容,如果未能解决你的问题,请参考以下文章

快速从领域中删除对象

删除领域数据库对象,但即使所有对象都为空,领域文件大小也保持不变。并且在时间上变得太大了

如何轻松删除领域中的所有对象

领域对象已被删除或失效

与服务器自动同步领域[关闭]

六 领域驱动设计-领域对象的生命周期