2010-02-14 2 views
1

У меня есть модель с 2-х лиц: RealEstate и контейнерКопирование графа весь объект - скопировать отношение

Контейнеры объект уже сохранены на постоянное хранилище с помощью следующей иерархии:

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 повторно назначьте его скопированному контейнеру с чем-то вроде [newContainer setLevel: [[container level] copy]], потому что NSNumber на самом деле является указателем, или нормально назначать [newContainer setLevel: [container level]] ??
  • как скопировать отношение ??? Я не могу просто скопировать подконтейнеры с помощью [newContainer setSubcontainers: [контейнерные контейнеры]] !!

Это то, что я делаю:

- (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: [контейнерные контейнеры]] !!

Просто установите объекты, а основные данные сделают правильную работу и правильно построят новые отношения. Когда вы передаете NSSet новому родительскому объекту, Core Data будет перебирать объекты в наборе и создавать новые отношения отношений для каждого из них для нового родительского объекта.

0

Благодарим вас за ответ. Прошу прощения, если напишите как новый ответ, но это единственный способ опубликовать снимок экрана.

Просто установите объекты и основные данные сделают правильную работу и правильно построят новые отношения. Когда вы передаете NSSet новому родительскому объекту, Core Data будет перебирать объекты в наборе и создавать новые отношения отношений для каждого из них для нового родительского объекта.

Я понимаю, что CoreData будет создавать новые связи отношения к новому родительского объекта и автоматически вносить необходимые изменения, особенно если отношение моделируется в обоих направлениях, но в моем случае что-то пойдет не так, может быть, из-за, как я разработал мой связи. Просмотр моего кода Я вижу, что [newContainer setParent: [parent parent]]; не требуется, поскольку «родительский» и «подконтейнер» являются обратными отношениями, поэтому установка «подконтейнеры» автоматически устанавливает «родительский». Но даже с этим изменением что-то не так.

Чтобы упростить задачу, я только что сделал это испытание:

  • Пусть говорят, что я просто хочу, чтобы скопировать поддерево, а не все дерево, например Контейнер 5 с ребенком Контейнер 6 (см иерархию от моего первого ответ)
  • сначала проверяет, что отношения находятся прямо от источника: если я распечатаю источникRealEstate Container 5, я вижу: Container5.parent = Container4, Container5.subcontainers = [Container 6]. Так что кажется, что все в порядке в источнике копирования
  • чем начать мою процедуру копирования ... после этого я пытаюсь распечатать таким же образом скопированный объект, и я вижу: Container5.parent = nil (WRONG), Container5.subcontainers = [Контейнер 6] (RIGHT). Чем я перепроверить исходный контейнер и я вижу: * Контейнер 5.parent = Контейнер 4 (RIGHT), Container5.subcontainer = пусто (НЕПРАВИЛЬНО)

Выводы: Вложенные перемещаются и не копируются

Это моя модель более детально:

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