iphone – 非法尝试在不同上下文中的对象之间建立关系“xyz”

我使用Apple的CoreDataBooks示例应用程序作为基础,将数据拉入后台的辅助托管对象上下文,然后将该数据合并到主要托管对象上下文中。

我收到的数据是一个Book实体,与所有者实体(称为“所有者”)具有一对一的关系。所有者实体与图书(称为“图书”)具有一对多的关系。

我的数据是以下形式的XML文档:

<Owner>
  <Name>alexpreynolds</Name>
  <ID>123456</ID>
</Owner>
<Books>
  <Book>Book One</Book>
  <Book>Book Two</Book>
  ...   
  <Book>Book N</Book>
</Books>

图书一至图书N与一个所有者(“alexpreynolds,123456”)相关联。

我将它解析为一个Owner实例和一个由Book实例组成的NSMutableSet。

当我尝试保存第一次,它保存精细,合并的数据显示在表视图中。

然而,在第二次保存时,当XML内容包含新书时,它不工作。

下面是发生了什么:

然后,我尝试加载包含尚未在主管理对象上下文中的新Book的XML文档。新书使用的是与其他书相关的所有者。

我有例程选择这个唯一的所有者管理对象(我已经在我的主要管理对象上下文中)和在主要MOC中找不到的唯一的书。

从这里,我在辅助MOC中创建一个新的Book对象,并且设置它的“所有者”关系,以指向在主要MOC中找到的唯一所有者。

当我保存,我得到以下错误:

*** Terminating app due to uncaught 
exception 'NSInvalidArgumentException', 
reason: 'Illegal attempt to establish a 
relationship 'owner' between objects in 
different contexts 

(source = <Book: 0x7803590> 
(entity: Book; id: 0x7802ae0 <x-coredata:///
Book/t527F06B2-3EB5-47CF-9A29-985B0D3758862>
; data: {
creationDate = 2009-10-12 06:01:53 -0700;
name = nil;
nameInitial = nil;
operations = (
);
owner = nil;
type = 0;
}) , 

destination = <Owner: 0x78020a0> (entity: 
Owner; id: 0x3a56f80 <x-coredata://043AF2F0-1AD0-
4078-A5E8-E9D7071D67D1/Owner/p1> ; data: {
books = "<relationship fault: 0x7801bf0 'books'>";
displayName = alexpreynolds;
ownerID = 123456;
}))'

如何在辅助MOC中创建新的实体,以便我仍然可以将其与主要MOC中的预先存在的所有者相关联?

您不能在不同的受管对象上下文中的对象之间存在关系。所以一个方法是把对象放到托管对象上下文中。

例如:

NSManagedObject *book = // get a book in one MOC
NSManagedObject *owner = // get an owner in a different MOC
[[owner mutableSetValueForKey:@"books"] addObject:[owner.managedObjectContext objectWithID:[book objectID]]];

所以你正在做的是抓取书与拥有者相同的托管对象上下文。但请记住,这只有在书已经保存的情况下才能实现。受管对象上下文将在持久存储中查找对象,因此必须首先保存。

http://stackoverflow.com/questions/1554623/illegal-attempt-to-establish-a-relationship-xyz-between-objects-in-different-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:iphone – 非法尝试在不同上下文中的对象之间建立关系“xyz”