2016-07-12 1 views
1

Je sais que plusieurs problèmes ont peut-être été dupliqués étant donné qu'aucune solution pointue n'a résolu mon problème, j'ai donc décidé de poster mon cas spécifique.Tentative illégale d'établir une relation 'objet' entre des objets dans différents contextes

Je travaille avec CoreData dans ma demande, et certains objets sont instanciés sans être effectivement sauvé sur le terrain, mon code de démarrage dans ces cas est la suivante:

-(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; 
} 

Cependant, un attribut de cette l'objet est la municipalité qui est déjà enregistré sur la base, et est choisi par un ActionSheet:

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

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

en ligne

endereco.municipio = municipio;

je reçois l'erreur suivante:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship' municipio 'between objects in different contexts.

L'erreur est clair, je suis en train d'établir une relation d'objets avec des contextes différents, mais dans mon cas, dans lequel l'objet parent est pas enregistré sur la base , et que l'objet enfant est déjà là, comment pourrais-je résoudre?

Répondre

0

j'ai réussi à résoudre le problème en ajoutant le Endereço dans le managedContext du Municipio:

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

Je ne sais pas si c'est la meilleure solution, mais cela a fonctionné parfaitement dans ce cas.

0

Vos commentaires semblent indiquer que vous connaissez la réponse. Ajoutez endereco au contexte (utilisez insertIntoManagedObjectContext: context plutôt que insertIntoManagedObjectContext: nil). Ce n'est pas une question d'être sauvé; vous devez vous assurer que les deux objets sont dans le même contexte. Il n'y a pas de chemin aux alentours. Vous ne pouvez pas créer de relations inter-contextes dans les propriétés (vous pouvez dans les propriétés récupérées, mais c'est compliqué et cela ne semble pas être un cas où vous le souhaitez).

+0

Ami, merci pour l'aide, mais je pourrais résoudre sinon voir dans ma réponse. – jucajl