复制整个对象图 - 复制关系

复制整个对象图 - 复制关系

问题描述:

我有2个实体模型:房地产和集装箱复制整个对象图 - 复制关系

容器对象已保存到永久存储与以下层次:

Container 1 
    Container 2 
    Container 3 
Container 4 
    Container 5 
     Container 6 

每个容器都有一个RealEstate所有者(在一个给定的层次结构中,realEstate总是相同的) 现在我想为每个容器的所有者realEstate创建一个层次结构的副本。 经过一些测试,在我看来,这不是一个小问题。

这是该模型的一个简化方案:

RealEstate (entity) 
------------------- 
name (string attribute) 
containers (relation) 

Container (entity) 
------------------ 
level (int attribute) 
name (string attribute) 
parent (self relation to another container) 
subcontainers (relation - set of containers) 
realEstate (relation) 

基本上每个容器具有自一个子容器关系,和母体关系,从而例如 容器1没有父但子容器= [容器2,容器3]等..

我有2个问题:

  • 如果我要复制单个属性(NSNumber的),我应该复制befo属性因为NSNumber实际上是一个指针,或者可以分配[newContainer setLevel:[container level]] ??,所以用[newContainer setLevel:[[container level] copy]]重新分配给复制的容器。
  • 如何复制关系?我不能简单地将子容器复制到[newContainer setSubcontainers:[container subcontainers]]!

这是我在做什么:

- (void)copyContainersFromRealEstate:(RealEstate *)sourceRealEstate toRealEstate:(RealEstate *)destinationRealEstate { 
    // read all RealEstate Containers to copy 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"realEstate == %@", sourceRealEstate]; 
[request setPredicate:predicate]; 
[request setEntity: [ NSEntityDescription entityForName:@"Container" 
       inManagedObjectContext:destinationRealEstate.managedObjectContext] ]; 

NSError *error; 
NSArray *results = [destinationRealEstate.managedObjectContext executeFetchRequest:request 
          error:&error]; 

if (results == nil) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
} 
[request release]; 

    // ******************************************************* 
// copy each caontainer changing the real estate 
Container *newContainer; 
for (Container *container in results) { 
     newContainer = (Container *)[NSEntityDescription insertNewObjectForEntityForName:@"Container" 
       inManagedObjectContext:destinationRealEstate.managedObjectContext]; 

     [newContainer setRealEstate:destinationRealEstate]; 
     [newContainer setLevel:[container level]]; 
     [newContainer setSubcontainers:[container subcontainers]]; // WRONG 
     [newContainer setName:[container name]]; 
     [newContainer setParent:[container parent]]; // WRONG 
} 
    // ******************************************************* 

}

任何帮助将不胜感激。 感谢

,如果我要复制单个属性(NSNumber的)我之前复制的属性,将其分配到的东西,如复制的容器[newContainer setLevel:[容器级别]复制]因为NSNumber的实际上是一个指针,或者可以分配[newContainer setLevel:[container level]] ??

将该值设置到新的对象,它会处理它,即使它是一个指针,因为核心数据将被向下写入值到数据库中,因此将它在某个时候被翻译成原始的和“打破“你关心的指针关系。

如何复制关系?我不能简单地将子容器复制到[newContainer setSubcontainers:[container subcontainers]]!

只需设置对象和核心数据就可以做正确的事情并正确构建新的关系。当您将NSSet传递给新的父对象时,核心数据将遍历集合中的对象并为它们中的每一个创建新的关系连接到新的父对象。

谢谢您的回复。 对不起,如果写入新的答案,但是发布屏幕截图的唯一方法。

只需设置对象和核心数据就可以做正确的事情并正确构建新的关系。当您将NSSet传递给新的父对象时,核心数据将遍历集合中的对象并为它们中的每一个创建新的关系连接到新的父对象。

我明白coredata将创造新的关系连接到新的父对象并自动进行必要的修改,特别是在关系在两个方向设计的,但是在我的情况不顺心的事,可能是由于我怎么设计我的关系。 回顾我的代码我看到[newContainer setParent:[container parent]];没有必要,因为“父”和“子容器”是相反的关系,所以设置“子容器”会自动设置“父”。但即使有这种变化,也有一些问题。

为了简化我只是做这个测试的问题:

  • 让我们说,我只想容器5复制子树,而不是整个树,例如其子容器6(见层次从我第一回答)
  • 首先检查来源的关系是否正确:如果我打印出sourceRealEstate容器5我看到:Container5.parent = Container4,Container5.subcontainers = [容器6]。所以似乎一切都进入复制源
  • 比开始我的复制过程...之后,我尝试以相同的方式打印出复制的对象,我看到:Container5.parent = nil(WRONG), Container5.subcontainers = [Container 6](RIGHT)。比我复检源容器和我看到:*容器5.parent =容器4(右),Container5.subcontainer =空(WRONG)

结论:子容器被移动,而不是被复制

这是我更详细的模型:

http://www.freeimagehosting.net/uploads/9aae9b9ac8.png

Container.parent关系:
http://www.freeimagehosting.net/uploads/7f5c6592ef.png

Container.subcontainers关系:
http://www.freeimagehosting.net/uploads/bff3e1abe8.png