relation illégale entre les objets dans des contextes différents: mais je n'ai qu'un contexte?

StackOverflow https://stackoverflow.com/questions/3505004

Question

je reçois l'erreur suivante:

  

'NSInvalidArgumentException', raison:   « Tentative illégale d'établir une   « Condition » relation entre   objets dans différents contextes

lors de l'exécution de mon application iphone. La partie pertinente de mon apparence modèle comme ceci:

AssessmentTree
-has one TreeCrown

TreeCrown
-has one TreeCrownCondition
-has one AssessmentTree

TreeCrownCondition
-has many TreeCrowns

Par souci du contexte, je vais mentionner que cette partie du modèle est conçu pour permettre un arboriculteur d'enregistrer l'état de la couronne d'un arbre. Il stocke une liste d'options pour l'évaluation de la couronne d'arbre qui peut également être modifié par l'utilisateur (donc TreeCrownConditions contient les options et les points TreeCrown.condition à la sélection spécifique faite dans une évaluation).

J'ai un UIPickerView qui charge ces options et associe l'option sélectionnée avec le AssessmentTree, en utilisant le code suivant dans didSelectRow: inComponent:

TreeCrownCondition *fc = (TreeCrownCondition *)[conditionArray objectAtIndex:[conditionPicker selectedRowInComponent:0]];
tree.crown.condition = fc;

Quand je lance cela, les premières fois que je choisi une tout option est bien, mais parfois (généralement après l'ajout / modification / suppression d'une option TreeCrownCondition) l'application se bloque sur les lignes ci-dessus avec l'erreur que j'ai posté au début .

L'erreur semble facile à fixer, Except que je suis seulement en utilisant un NSManagedObjectContext tout au long de l'ensemble de mon application. Chaque nouveau contrôleur saisit quand il est chargé avec le code suivant:

if(!managedObjectContext){
    managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}

Je ne pouvais pas trouver beaucoup d'information sur cette erreur ou comment le résoudre, et je ne doute pas trouver quelqu'un qui avait eu ce problème sans utiliser de multiples contextes.

Je ne peux que supposer que je en quelque sorte faire ont de multiples contextes, mais je ne vois pas comment cela est possible. Qu'est-ce que je manque?

Modifier Heres la trace de pile:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'condition' between objects in different contexts (source = <TreeCrown: 0x64b9f00> (entity: TreeCrown; id: 0x648db30 <x-coredata://6E17F271-7670-44EA-9901-5AB58DCA8AC7/TreeCrown/p3> ; data: {
    condition = "0x64e5c50 <x-coredata://6E17F271-7670-44EA-9901-5AB58DCA8AC7/TreeCrownCondition/p4>";
    images = "<relationship fault: 0x64d5e10 'images'>";
    recommendation = "0x64a5320 <x-coredata://6E17F271-7670-44EA-9901-5AB58DCA8AC7/TreeCrownRecommendation/p1>";
    tree = "0x6488f70 <x-coredata://6E17F271-7670-44EA-9901-5AB58DCA8AC7/AssessmentTree/p1>";
}) , destination = <TreeCrownCondition: 0xf218a40> (entity: TreeCrownCondition; id: 0xf215c20 <x-coredata://6E17F271-7670-44EA-9901-5AB58DCA8AC7/TreeCrownCondition/p2> ; data: <fault>))'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x029d5919 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x027ea5de objc_exception_throw + 47
    2   CoreData                            0x02461810 _PFManagedObject_coerceValueForKeyWithDescription + 1248
    3   CoreData                            0x02478245 _sharedIMPL_setvfk_core + 197
    4   CoreData                            0x0247bfe7 _svfk_0 + 39
    5   landscapes                          0x0000e569 -[AssessmentTreeCRViewController pickerView:didSelectRow:inComponent:] + 571
    6   UIKit                               0x004647aa -[UIPickerView _sendSelectionChangedForComponent:] + 100
    7   UIKit                               0x00602ed3 -[UIScroller _scrollAnimationEnded] + 130
    8   UIKit                               0x0050e792 -[UIAnimator stopAnimation:] + 467
    9   UIKit                               0x0050e557 -[UIAnimator(Static) _advance:] + 298
    10  GraphicsServices                    0x034c856d HeartbeatTimerCallback + 35
    11  CoreFoundation                      0x029b6d43 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
    12  CoreFoundation                      0x029b8384 __CFRunLoopDoTimer + 1364
    13  CoreFoundation                      0x02914d09 __CFRunLoopRun + 1817
    14  CoreFoundation                      0x02914280 CFRunLoopRunSpecific + 208
    15  CoreFoundation                      0x029141a1 CFRunLoopRunInMode + 97
    16  GraphicsServices                    0x034c52c8 GSEventRunModal + 217
    17  GraphicsServices                    0x034c538d GSEventRun + 115
    18  UIKit                               0x0047cb58 UIApplicationMain + 1160
    19  landscapes                          0x00001eb6 main + 104
    20  landscapes                          0x00001e45 start + 53
)
terminate called after throwing an instance of 'NSException'
Était-ce utile?

La solution

Comment créez-vous vos entités? Si vous créez une entité sans NSManagedObjectContext qu'elle produirait la même erreur.

Mise à jour

De l'apparence de votre code Je devine que ce que vous obtenez en arrière sur le sélecteur est pas ce que vous attendez ou lancer inutilement.

Je mis un point d'arrêt sur objc_throw_exception et dupliquer le crash dans le débogueur. Une fois que vous faites cela en inspectant les objets et je pense que vous constaterez que ce que vous obtenez sur le sélecteur est pas un NSManagedObject mais autre chose.

Autres conseils

J'ai vu des erreurs étranges comme celui-ci sont souvent dues à un magasin de données périmées. Avez-vous essayé d'enlever complètement l'application de la carte SIM ou d'un dispositif (par exemple supprimer tap-hold)? Compilons propre, puis construire et exécuter.

Il est intéressant, cette erreur peut être causée par le mauvais NSManaged objet inséré dans un autre objet NSManaged.

Quelque chose comme ceci: C'EST À DIRE orange A    Apple B // plusieurs à un rapport

A.b = [NSOrderedset setwithObjects Orange, nil];

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top