存档具有关系的核心数据实体
问题描述:
我希望能够支持复制和粘贴显示核心数据实体的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的头痛问题。有人可以确认这是事实吗?它是否必须如此努力?
答
您尚未仔细阅读该文档。在部分自定义员工逻辑,它解释了关系将不复制有几个原因在那里描述。然后它解释了代码如何处理只复制特定属性。看起来你似乎只是选择了特定的属性来复制文档,而不是遗漏关系。
至于你看到的错误,
-[NSManagedObject encodeWithCoder:] unrecognized selector sent to instance 0x22fd410
这是因为你在包含不符合NSCoding
,具体地说,管理对象的对象字典调用archivedDataWithRootObject:
。像这样的归档只适用于属性列表类型 - 对于其他所有内容,您必须执行NSCoding
,否则您会收到此错误。
如果要复制关系,复制托管对象ID的URI可能是合理的。如果您在使用临时对象ID问题,请执行下列操作之一:
- 保存更改
- 呼叫
obtainPermanentIDsForObjects:error:
为对象,以得到永久编号不保存。
您能提供“NSPersistentDocument核心数据教程”的链接吗?我发现只有标题页上显示“不推荐”的Mac OS X 10.4版本。 – 2013-03-23 09:09:41