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

Ale*_*lds 44 iphone core-data nsfetchedresultscontroller

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

我所Book引入的数据是与Owner实体(称为"所有者")具有一对一关系的实体.该Owner实体与Book(称为"书籍")有很多关系.

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

<Owner>
  <Name>alexpreynolds</Name>
  <ID>123456</ID>
</Owner>
<Books>
  <Book>Book One</Book>
  <Book>Book Two</Book>
  ...   
  <Book>Book N</Book>
</Books>
Run Code Online (Sandbox Code Playgroud)

Book Onethrough Book N与one Owner("alexpreynolds, 123456")相关联.

我解析此为Owner实例和NSMutableSet组成的Book实例.

当我第一次尝试保存时,它保存得很好,合并的数据显示在表视图中.

但是,在第二次保存时,当XML内容包含新书时,它不起作用.

这是发生的事情:

然后,我尝试加载一个XML文档,该文档包含一个Book尚未在主要托管对象上下文中的新文档.新Book的使用Owner与其他Books 相关的相同.

我有例程挑选出这种独特的Owner管理对象(我已经在我的主要管理对象上下文)和独特的Book没有在主MOC找到.

由此,我Book在辅助MOC中创建了一个新对象,并将其" owner"关系设置为指向Owner我在主要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;
}))'
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lex 69

您不能在不同的托管对象上下文中的对象之间建立关系.因此,解决这个问题的一种方法是将对象引入托管对象上下文.

例如:

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]]];
Run Code Online (Sandbox Code Playgroud)

所以你所做的实际上就是Book将其提取到同一个托管对象上下文中owner.但请记住,这只有book在已经保存的情况下才有可能.托管对象上下文将在持久性存储中查找对象,因此必须先保存它.


小智 10

我有同样的问题,这句话帮助我解决了错误.

您不能在不同的托管对象上下文中的对象之间建立关系.因此,解决这个问题的一种方法是将对象引入托管对象上下文.

这是我的代码(我替换了变量以使其适合您):

// Have the owner object and get the managedObjectContext
Owner *owner = [[DataFunctions alloc] getCurrentOwner];
NSManagedObjectContext *context = [owner managedObjectContext]; 

// Create a book and use the manageObjectContext of owner
Book *book = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:context];
[newQuote setValue: "Book Title" forKey:@"title"];
[newQuote setOwner:owner];
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助 :)