2012-02-18 41 views
2

您好想從我的核心數據庫複製一個對象。現在我正在使用CoreData - 複製現有對象

 movement2 = [NSEntityDescription 
            insertNewObjectForEntityForName:@"Movement" 
            inManagedObjectContext:self.managedObjectContext]; 

     movement2.name = movement.name; 
     movement2.value = movement.value; 
     movement2.date = movement.date; 
     ... 

它的工作原理。但...

是否有任何方法可以在一行代碼中複製movementmovement2的所有值?

回答

8

與NSObject不同,NSManagedObject提供了一個API來遍歷其屬性和關係。或者說,它是實體描述。不過,這不是一蹴而就的。

movement2 = [NSEntityDescription insertNewObjectForEntityForName:@"Movement" 
              inManagedObjectContext:self.managedObjectContext]; 
NSEntityDescription *entity = [movement entity]; 
for (NSString *propertyName in [entity propertiesByName]) { 
    [movement2 setValue:[movement valueForKey:propertyName] forKey:propertyName]; 
} 

查看the documentation瞭解更多詳情。

這將足以克隆大部分對象。如果數據庫結構是正確的,那麼以這種方式複製關係,它們的反向關係也會被更新。因此,如果您的移動與MovementDirection有所關係,並且MovementDirection與parentMovements之間的關係爲parentMovements,則在調用上述代碼後,此組內將同時具有movementmovement2

+0

您可以使用'entity.propertiesByName'結合屬性和關係。少一個循環;) – Michael 2014-04-26 08:04:13

+0

@邁克爾噢,我的上帝,我不知道我是如何錯過了,並編寫了兩個循環的幫手很多!謝謝,我編輯了答案。 – coverback 2014-04-26 17:48:46

1

API中沒有方法複製NSManagedObjects,因爲它們不符合NSCopying,也不符合NSCoding。這是有道理的,考慮到如果你想複製這樣一個對象,如果它有關係的話,通常並不清楚:它是否應該與同一個對象或它們的副本有關係?那些副本呢?這些疑難問題的答案可能取決於關係的性質(多對多或一對一),因此也取決於核心數據的具體使用情況。

所以簡短的回答:我會做你在你的片段做什麼,或者寫一個方法來做一個副本。它看起來像你的NSManagedObject只有簡單的屬性和沒有關係,所以它應該是直截了當的。