2013-03-23 6 views
0

Я хочу иметь возможность поддерживать копирование и вставку для строки tableview, содержащей основной объект данных. Этот объект имеет один атрибут и два отношения. Когда я использую технику архивирования словаря, рекомендованную Apple (из «NSPersistentDocument Core Data Tutorial»), я обнаружил, что отношения вызывают ошибку. Вот существенная часть кода, где происходит проблема:Архивирование объекта данных ядра с отношением

for (id sectionObject in selectedSectionsArray){ 
    NSDictionary *thisDictionary = [sectionObject dictionaryRepresentation]; // 'sectionObject' has 1 attribute and 2 relationships (one-to-many) 
    [copyObjectsArray addObject:[sectionObject dictionaryRepresentation]]; 
} 
NSPasteboard *generalPasteboard = [NSPasteboard generalPasteboard]; 
[generalPasteboard declareTypes:[NSArray arrayWithObjects:MSSectionsPBoardType, NSStringPboardType, nil] owner:self]; 
NSData *copyData = [NSKeyedArchiver archivedDataWithRootObject:copyObjectsArray]; // Here's where it crashes. ERROR MESSAGE: "-[NSManagedObject encodeWithCoder:] unrecognized selector sent to instance 0x22fd410" 

Таким образом, кажется, единственный способ скопировать отношения к монтажному столу должен быть архивировать его URI. В этом случае мне приходится иметь дело с головной болью, связанной с временными идентификаторами. Может ли кто-нибудь подтвердить, что это так? Должно быть, это так сложно?

+0

Можете ли вы предоставить ссылку на «Учебное пособие по основным данным NSPsistentDocument»? Я нашел только версию для Mac OS X 10.4, которая гласит «Не рекомендуется» на титульном листе. –

ответ

1

Вы недостаточно хорошо читали этот документ. В разделе Пользовательская логика сотрудников объясняет, что отношения не будут скопированы по нескольким причинам, описанным там. Затем он объясняет, как код обрабатывает только определенные атрибуты. Похоже, вы следовали за документом, чтобы выбрать конкретные атрибуты для копирования, но не об отсутствии отношений.

Что касается ошибки, вы видите,

-[NSManagedObject encodeWithCoder:] unrecognized selector sent to instance 0x22fd410 

Это происходит потому, что вы вызываете archivedDataWithRootObject: на словарь, который содержит объекты, которые не соответствуют NSCoding, в частности, ваши управляемые объекты. Архивирование, подобное этому, автоматически работает только для типов списков свойств - для всего остального вы должны реализовать NSCoding или получить эту ошибку.

Копирование идентификатора идентификатора управляемого объекта, вероятно, разумно, если вы хотите скопировать отношения. Если у вас возникли проблемы с идентификаторами временных объектов, выполните одно из следующих действий:

  • Сохранить изменения
  • вызов obtainPermanentIDsForObjects:error: для объектов, чтобы получить постоянные идентификаторы без сохранения.
Смежные вопросы