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

时间:2016-07-12 20:23:06

标签: ios core-data nsmanagedobject nsmanagedobjectcontext

我知道有几个问题可能重复,但是,没有尖头的解决方案解决了我的问题,所以我决定发布我的具体案例。

我在我的应用程序中使用CoreData,并且实例化了一些对象而没有有效地保存在地面上,在这些情况下我的启动代码如下:

-(id)initEntity:(NSManagedObjectContext*)context{
    AppDelegate appDelegate * = [[UIApplication sharedApplication] delegate];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Endereco" inManagedObjectContext: appDelegate.managedObjectContext];
    self = (Endereco*)[[Endereco alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];

    return self;
}

但是,此对象的属性是已保存在基础上的市政当局,并由ActionSheet选择:

if (actionSheet == actionSheetMunicipios) {
        Municipio *municipio = [municipios objectAtIndex:buttonIndex-1];

        endereco.municipio = municipio;
        [textMunicipio setText:endereco.municipio.nome];
    }

在行

  

endereco.municipio = municipio;

我收到以下错误:

  

***由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:'非法尝试建立   关系' municipio'在不同背景下的对象之间。

错误很明显,我正在尝试建立具有不同上下文的对象关系,但在我的情况下,其中Parent对象未保存在基础上,并且子对象已经存在,我怎么能解决?

2 个答案:

答案 0 :(得分:0)

您的评论似乎表明您知道答案。将endereco添加到上下文中(使用insertIntoManagedObjectContext: context而不是insertIntoManagedObjectContext: nil)。这不是被拯救的问题;您需要确保两个对象在同一个上下文中。没有办法解决这个问题。您不能在属性中创建跨上下文关系(您可以在获取的属性中,但它很复杂,这似乎不是您想要的情况)。

答案 1 :(得分:0)

我设法通过在Municipio的managedContext中添加Endereco来解决问题:

   if (actionSheet == actionSheetMunicipios) {
        Municipio *municipio = [municipios objectAtIndex:buttonIndex-1];
        [municipio.managedObjectContext insertObject:endereco];
        [endereco setMunicipio:municipio];
        [textMunicipio setText:endereco.municipio.nome];
    }

我不知道这是否是最佳解决方案,但在这种情况下它完美无缺。