存档具有关系的核心数据实体

问题描述:

我希望能够支持复制和粘贴显示核心数据实体的tableview行。这个实体有一个属性和两个关系。当我使用Apple推荐的字典存档技术(来自'NSPersistentDocument核心数据教程')时,我发现这些关系会引发错误。这里就是发生问题的代码的关键一环:存档具有关系的核心数据实体

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的唯一途径。在那种情况下,我必须处理引用临时ID的头痛问题。有人可以确认这是事实吗?它是否必须如此努力?

+0

您能提供“NSPersistentDocument核心数据教程”的链接吗?我发现只有标题页上显示“不推荐”的Mac OS X 10.4版本。 – 2013-03-23 09:09:41

您尚未仔细阅读该文档。在部分自定义员工逻辑,它解释了关系将不复制有几个原因在那里描述。然后它解释了代码如何处理只复制特定属性。看起来你似乎只是选择了特定的属性来复制文档,而不是遗漏关系。

至于你看到的错误,

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

这是因为你在包含不符合NSCoding,具体地说,管理对象的对象字典调用archivedDataWithRootObject:。像这样的归档只适用于属性列表类型 - 对于其他所有内容,您必须执行NSCoding,否则您会收到此错误。

如果要复制关系,复制托管对象ID的URI可能是合理的。如果您在使用临时对象ID问题,请执行下列操作之一:

  • 保存更改
  • 呼叫obtainPermanentIDsForObjects:error:为对象,以得到永久编号不保存。