2012-02-18 3 views
2

Привет, хотел бы дублировать объект из моих основных данных db. Сейчас я используюCoreData - Дублировать существующий объект

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

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

и он работает. но ...

Есть ли способ скопировать все значения movement в movement2, в одной строке кода?

ответ

8

NSManagedObject, в отличие от NSObject, предоставляет 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 имеет обратное отношение 1 к коду parentMovements, этот набор parentMovements будет иметь как movement, так и movement2 внутри, после того как вы позвоните по коду выше.

+0

Вы можете использовать 'entity.propertiesByName', который объединяет оба атрибута и отношения. Один меньше за цикл;) – Michael

+0

@ Майкл, о, мой бог, я не знаю, как я пропустил это и закодировал много помощников с двумя петлями! Спасибо, я отредактировал ответ. – coverback

1

В API отсутствует метод для копирования NSManagedObjects, так как они не соответствуют NSCopying или NSCoding. Это имеет смысл, учитывая, что часто не ясно, как вы хотите скопировать такой объект, если у него есть отношения: должны ли они иметь отношения к тем же объектам или их копии? Как насчет этих копий? Это сложные вопросы, ответы на которые, вероятно, зависят от характера отношений (для многих или к-одному) и, следовательно, от конкретных случаев использования основных данных.

Так короткий ответ: я бы сделал то, что вы делаете в своем фрагменте, или, может быть, напишите метод, чтобы сделать копию. Похоже, ваши NSManagedObject имеют только простые атрибуты и никаких отношений, поэтому это должно быть просто.

Смежные вопросы