2012-02-18 40 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只有简单的属性和没有关系,所以它应该是直截了当的。