2010-02-14 81 views
1

我有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 
} 
    // ******************************************************* 

}

任何幫助將不勝感激。 感謝

回答

1

,如果我要複製單個屬性(NSNumber的)我之前複製的屬性,將其分配到的東西,如複製的容器[newContainer setLevel:[容器級別]複製]因爲NSNumber的實際上是一個指針,或者可以分配[newContainer setLevel:[container level]] ??

將該值設置到新的對象,它會處理它,即使它是一個指針,因爲核心數據將被向下寫入值到數據庫中,因此將它在某個時候被翻譯成原始的和「打破「你關心的指針關係。

如何複製關係?我不能簡單地將子容器複製到[newContainer setSubcontainers:[container subcontainers]]!

只需設置對象和核心數據就可以做正確的事情並正確構建新的關係。當您將NSSet傳遞給新的父對象時,核心數據將遍歷集合中的對象併爲它們中的每一個創建新的關係連接到新的父對象。

0

謝謝您的回覆。 對不起,如果寫入新的答案,但是發佈屏幕截圖的唯一方法。

只需設置對象和核心數據就可以做正確的事情並正確構建新的關係。當您將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