relation illégale entre les objets dans des contextes différents: mais je n'ai qu'un contexte?
-
29-09-2019 - |
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'
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];