非法的尝试建立关系'xyz'之间的对象,在不同的情况下
-
20-09-2019 - |
题
我用苹果 CoreDataBooks
样本应用程序为基础拉数据并入一个次级托管对象的上下文的背景,然后合并这些数据进主管对象的上下文。
据我拉在是一个 Book
实体与一对一的关系有一个 Owner
实体(称为"老板").的 Owner
实体具有对多关系 Book
(称为"books").
我的数据是一种XML文件的形式:
<Owner>
<Name>alexpreynolds</Name>
<ID>123456</ID>
</Owner>
<Books>
<Book>Book One</Book>
<Book>Book Two</Book>
...
<Book>Book N</Book>
</Books>
Book One
通过 Book N
与一个 Owner
("alexpreynolds, 123456"
).
我分析此进入一个 Owner
实例和一个 NSMutableSet
由的 Book
实例。
当我试图救助的第一时间,这样可以节省现和合并数据显示在表图。
在第二节省,但是,当XML内容包含一本新书,它不工作。
这里发生了什么:
然后我试图载在XML文档中包含一个新的 Book
已经不在主管对象的上下文。新的 Book
使用的是相同的 Owner
因为这是与其他 Book
s.
我有程序,挑选出的这一独特 Owner
管理对象(其中我已经有了在我的主管对象的上下文)和独特的 Book
就是 不 现在的主要商务部.
从这个,我建一个新的 Book
目的在次级部,我设置了它的"owner
"关系要点的独特的 Owner
我发现在的主要商务部.
当我救了,我得到的以下错误:
*** 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;
}))'
我如何创建一个新的 Book
实体的次级部,这样,我仍然可以将其与一个预先存在的 Owner
在主要交通部?
解决方案
你不能拥有对象之间的关系在不同的管理对象的情况。这样一个方式就是把对象为托管对象的上下文。
例如:
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]]];
所以你在做什么实际获取 Book
到相同的托管对象的上下文 owner
.请记住,不过,这仅仅是可能的,如果 book
已经被保存。托管对象的上下文是要寻找的对象的持久性储存,因此它必须保存的第一个。
其他提示
我有同样的问题,这句话帮我解决这一错误。
你不能拥有对象之间的关系在不同的管理 目的情况。这样一个方式就是把 对象为托管对象的上下文。
这是我的代码(I替代变量,以让它为你工作):
// 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];
我希望这有助于:)
在这里,你都在试图建立关系的两个对象是牵强/建立与一个不同的上下文。核心数据不会让你来建立这种关系。为了实现这个,你应该获取的第二个目(你想让关系有)与上下文中的第一个目与objectID.现在你应该能够建立一个有关这两者之间的对象。例如:
MagicalRecord.saveWithBlock({[unowned self] (localContext: NSManagedObjectContext!) in
let user = User.MR_createEntityInContext(localContext)!
.....
.....
}) //here local context stores data on end of block itself
MagicalRecord.saveWithBlock({[unowned self] (localContext: NSManagedObjectContext!) in
let address = Address.MR_createEntityInContext(localContext)!
.....
.....
let user = localContext.objectWithID(self.user!.objectID) as! User
user.address = address
})
希望这会帮助你!
作为错误的说,你们是不允许有关系的一个核心的数据对象的,其价值是设于另一个目保持在一个不同的上下文。一种方法可以绕过这个是一直等到在保存的新的对象和将其合并回的主要方面,那么设置的 owner
关系作为适当的(由于两者对象都是现在的同样情况下,没有任何问题与那)。
book *book = [mainContext ........] //Get book from default context
NSManagedObjectID *objectId = [book objectID];
Book *tmpBook = [tmpContext objectWithID:objectId]; //Now book has the legal relationship
迅速的版本...
context.insert(objectFromOtherContext)