【问题标题】:Illegal attempt to establish a relationship非法建立关系的企图
【发布时间】:2012-12-04 14:57:34
【问题描述】:

我遇到了这个令人讨厌的崩溃和错误。

此代码运行时发生崩溃:

    Address *address = [[Address alloc] initWithEntity:[NSEntityDescription entityForName:@"Address" inManagedObjectContext:managedObjectContext] insertIntoManagedObjectContext:nil];

        //Crashes here!
        [person addAddressObject:address];

Illegal attempt to establish a relationship 'person' between objects in different contexts

整个控制台错误如下。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'person' between objects in different contexts (source = <Address: 0x1f87e270> (entity: Address; id: 0x1f87e2b0 <x-coredata:///Address/t748EE284-0311-4489-9654-1D902EB0D4CC2> ; data: {
    addressLine1 = "";
    addressLine2 = "";
    addressLine3 = "";
    city = "";
    country = "";
    person = nil;
    state = "";
    title = "";
    zip = "";
}) , destination = <Person: 0x1ed9e1e0> (entity: Person; id: 0x1ed9c710 <x-coredata://ED0283A9-A847-407E-BFEC-CF2BF85C6A9C/Person/p1> ; data: {
    address =     (
        "0x1f87e2b0 <x-coredata:///Address/t748EE284-0311-4489-9654-1D902EB0D4CC2>",
        "0x1ed93e70 <x-coredata://ED0283A9-A847-407E-BFEC-CF2BF85C6A9C/Address/p1>"
    );
    favourite = nil;
    firstName = Josh;
    lastName = Kahane;
}))'

我不知道如何解决这个问题。大概它认为有两个不同的managedObjectContexts?但是,在我的应用程序中,我只引用了我的应用程序委托中的内容(在 viewDidLoad 处运行):

if (managedObjectContext == nil)
    {
        managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
        NSLog(@"After managedObjectContext: %@",  managedObjectContext);
    }

关于从哪里开始寻找差异的任何想法?谢谢。

编辑:

新发现。就在应用程序崩溃之前,我已经对地址和人员管理的对象上下文进行了 NSLogged。原来地址上下文是(null),即使我事先运行检查以设置上下文(如果它为零)。

【问题讨论】:

  • 第一个建议:1) 记录[address managedObjectContext][person managedObjectContext] 以确保上下文相同。 2)会不会是视图在某个时候被卸载了,下一次检查if (managedObjectContext == nil) ...创建了一个新的MOC? 3)在创建MOC的地方(在AppDelegate中)设置断点,看是否被调用了两次。
  • 一点额外发现,我已将其添加到我的问题中。即使我事先检查上下文,知道为什么它为空吗?
  • 为什么在address的创建中使用... insertIntoManagedObjectContext:nil]?不应该是... insertIntoManagedObjectContext:managedObjectContext] 吗?
  • 我最初不会将它插入到上下文中,以防用户取消他们的操作。这样它可以作为一个临时对象保存,然后当用户到达确认点时插入该对象。

标签: iphone objective-c ipad core-data


【解决方案1】:

您将其插入到 nil managedObjectContext

您需要将对象插入到您用于实体的NSManagedObjectContext 中。即managedObjectContext

在 Address 对象的 alloc init 中。

阅读您在 OP 中的评论。

你应该……

保存所有必需的值,然后在确认时创建地址对象并一次性将其全部插入。

或者……

创建对象并插入它以创建所有关系,然后如果用户按下取消,则删除该对象。

我会做这两个中的一个来避免这个错误。

【讨论】:

    【解决方案2】:

    你说:

    Address *address = [[Address alloc] initWithEntity:[NSEntityDescription entityForName:@"Address" inManagedObjectContext:managedObjectContext] insertIntoManagedObjectContext:nil];
    

    你为什么要把它插入一个 nil 上下文。您不应该传递托管对象上下文而不是 nil。

    【讨论】:

    • 我最初不会将它插入到上下文中,以防用户取消他们的操作。这样它可以作为一个临时对象保存,然后当用户到达确认点时插入该对象。
    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多