2009-11-18 65 views
0

我不知道自己是否做得太多,可能更依赖CoreData。假设我有两个托管对象Dog和Tail,它们具有一对一的关系。狗有一个关系,尾巴,这是可选的。它的反面是拥有狗。 Dog to Tail的删除规则是级联的。尾巴拥有狗关系也是可选的。其删除规则是无效的。CoreData - 自动维护关系需要多少工作

通过CoreData生成tail和owning Dog作为保留属性。

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

  1. 移动狗一个尾巴X到狗乙
  2. 删除狗A(不删除狗B的新尾巴X)。

我一直在做这样的事情,写的全为清楚起见

-(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]; 
} 

回答

2

是更换此,-graft就足够了。核心数据在生活中的真正目的是根据管理对象模型提供的描述维护对象实例集合的对象图。如果您将关系声明为一对一,则分配(在此情况下为)A.tail.owningDog=B将重置一对一关系,并在必要时中断以前的关系。这就是在Core Data模型中使用逆关系的原因,即使您不认为需要在两个方向上遍历关系。相反的关系允许核心数据通过以上述方式管理整个关系来帮助您。