CoreData - 自动维护关系的工作量

时间:2009-11-18 14:03:00

标签: iphone core-data

我想知道自己是否做得太多了,可能更依赖CoreData。假设我有两个托管对象,Dog和Tail,它们具有一对一的关系。狗有一种关系,尾巴,这是可选的。它的逆是拥有狗。从Dog到Tail的删除规则是级联的。 Tail的拥有狗关系也是可选的。它的删除规则无效。

tail和owningDog都是由CoreData生成的保留属性。

我需要做什么,最低限度地完成以下任务?

  1. 将狗A的尾巴X移至狗B
  2. 删除狗A(不删除狗B的新尾X)。
  3. 为了清晰起见,我一直在做这样的事情,

    -(void)graftThenKill
    {
    Tail* tempTail = A.tail;
    A.tail = nil; // releases X, sets relationship to nil so we can delete without cascading
    B.tail = tempTail; // retains X, sets Tail's owningDog to B
    [moc deleteObject:A]; // now we have his tail, don't need A
    }
    

    我可以用

    替换它吗?
    -(void)graft
    {
    A.tail.owningDog = B; // Makes A's tail nil, safe to delete A without deleting X?
    [moc deleteObject:A];
    }
    

1 个答案:

答案 0 :(得分:2)

是的,-graft就足够了。 Core Data的真正目的是根据托管对象模型提供的描述维护对象实例集合的对象图。如果您将关系声明为一对一,那么分配(在这种情况下)A.tail.owningDog=B将重置一对一关系,如有必要,可以打破以前的关系。这就是在Core Data模型中使用反向关系的原因,即使您认为不需要在两个方向上遍历关系。反向关系允许Core Data通过我上面描述的方式管理整个关系来帮助您。