非法尝试在不同上下文中的对象之间建立关系 'object'
Illegal attempt to establish a relationship 'object' between objects in different contexts
我知道有几个问题可能重复,但是,没有针对性的解决方案解决我的问题,所以我决定 post 我的具体案例。
我在我的应用中使用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;
我收到以下错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a
relationship' municipio 'between objects in different contexts.
错误很明显,我试图建立具有不同上下文的对象的关系,但在我的情况下,父对象没有保存在基础上,而子对象已经存在,如何我能解决吗?
您的评论似乎表明您知道答案。将 endereco
添加到上下文中(使用 insertIntoManagedObjectContext: context
而不是 insertIntoManagedObjectContext: nil
)。这不是得救的问题;您需要确保这两个对象处于同一上下文中。没有办法解决这个问题。您不能在属性中创建跨上下文关系(您可以在获取的属性中创建它,但这很复杂,而且这似乎不是您想要的情况)。
我设法通过在 Municipio 的 managedContext 中添加 Endereco 来解决问题:
if (actionSheet == actionSheetMunicipios) {
Municipio *municipio = [municipios objectAtIndex:buttonIndex-1];
[municipio.managedObjectContext insertObject:endereco];
[endereco setMunicipio:municipio];
[textMunicipio setText:endereco.municipio.nome];
}
我不知道这是否是最好的解决方案,但在这种情况下效果很好。
我知道有几个问题可能重复,但是,没有针对性的解决方案解决我的问题,所以我决定 post 我的具体案例。
我在我的应用中使用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;
我收到以下错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship' municipio 'between objects in different contexts.
错误很明显,我试图建立具有不同上下文的对象的关系,但在我的情况下,父对象没有保存在基础上,而子对象已经存在,如何我能解决吗?
您的评论似乎表明您知道答案。将 endereco
添加到上下文中(使用 insertIntoManagedObjectContext: context
而不是 insertIntoManagedObjectContext: nil
)。这不是得救的问题;您需要确保这两个对象处于同一上下文中。没有办法解决这个问题。您不能在属性中创建跨上下文关系(您可以在获取的属性中创建它,但这很复杂,而且这似乎不是您想要的情况)。
我设法通过在 Municipio 的 managedContext 中添加 Endereco 来解决问题:
if (actionSheet == actionSheetMunicipios) {
Municipio *municipio = [municipios objectAtIndex:buttonIndex-1];
[municipio.managedObjectContext insertObject:endereco];
[endereco setMunicipio:municipio];
[textMunicipio setText:endereco.municipio.nome];
}
我不知道这是否是最好的解决方案,但在这种情况下效果很好。