单一上下文但“非法尝试在不同上下文中的对象之间建立关系‘xyz’

Posted

技术标签:

【中文标题】单一上下文但“非法尝试在不同上下文中的对象之间建立关系‘xyz’【英文标题】:single context but "Illegal attempt to establish a relationship 'xyz' between objects in different contexts 【发布时间】:2013-04-24 16:58:41 【问题描述】:

我有一个上下文,我想在上下文中的一个现有对象(Veranstaltung)和一个新对象(Ticket)之间创建一个关系。 p>

 NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; //constructor get the Context from the appDelegate

Ticket *ticket = [NSEntityDescription insertNewObjectForEntityForName:@"Ticket" inManagedObjectContext:managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Veranstaltung" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"vID == %@", veranstaltung.vID];
[fetchRequest setPredicate:predicate];
NSError *error = nil;

NSArray *fetchedRequests = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
NSLog(@"FetchedRequests count: %d", fetchedRequests.count);

if(fetchedRequests !=nil)
   [ticket setEvent:fetchedRequests[0]];

在设置事件时,应用程序崩溃.. 有人有想法吗?谢谢!

【问题讨论】:

报错中提到的关系是什么?其实不是'xyz',是吗? 啊每次我都没有提到,这不是“票”,它的“gekauftesTicket”,“票”到“Veranstaltung”的倒数 @Jonathan 你是怎么解决你的问题的? 【参考方案1】:

从错误信息来看,Core Data 似乎感觉TicketVeranstaltung 是在不同的上下文中。查看前几行代码...

[self managedObjectContext]; //constructor get the Context from the appDelegate

Ticket *ticket = [NSEntityDescription insertNewObjectForEntityForName:@"Ticket" inManagedObjectContext:managedObjectContext];

看起来您在其中一行遗漏了一些内容,结果是第二行的managedObjectContext 不是您想的那样。您的意思可能是:

NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; //constructor get the Context from the appDelegate

否则:

Ticket *ticket = [NSEntityDescription insertNewObjectForEntityForName:@"Ticket" inManagedObjectContext:[self managedObjectContext]];

事实上,第一行没有做任何有用的事情,因为结果被丢弃了。我建议将第二行放在第三行之后,并在任何地方使用第三行中的 context 局部变量。

【讨论】:

哦,对不起,我忘了说,managedObjectContext 之前已初始化(我试图缩短它) 那么为什么需要managedObjctContextcontext 局部变量呢?如果这确实是您的代码的样子,那么它们都指向相同的上下文。如果您的真实代码不同,则它们有可能指向不同的上下文并且可以解释错误。为 ticket 和您的 fetch 请求使用单个本地上下文指针消除了上下文不同的可能性。 是的,你说得对,好点。我用 managedObjectContext 替换了上下文,但这并不能解决问题 请注意,您不能在不同的数据存储之间创建关系。如果您的门票在一家商店,而活动在另一家商店,那可能就是问题所在。也许这是一个措辞不当的错误信息。 “商店”是什么意思?我有一个带有实体 Veranstaltung、Tickets 等的模型。所以首先我创建了一些“Veranstaltung”(事件;))然后我想购买一张票并将其保存在相同的模型和上下文中,我想创建一个关系门票和活动

以上是关于单一上下文但“非法尝试在不同上下文中的对象之间建立关系‘xyz’的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

为啥我的产品->存档因“非法尝试在不同上下文中的对象之间建立关系”压缩类型“而失败?

[沫沫金]软件单一功能点,说明书编写模板

具有实体框架的具有多个线程的单一上下文