次のエラーが発生します。
'NSInvalidArgumentException'、理由:'異なるコンテキストのオブジェクト間の関係'条件'を確立しようとする不正な試み
私のiPhoneアプリを実行しているとき。私のモデルの関連部分は次のようになります。
AssessmentTree
-has one TreeCrown
TreeCrown
-has one TreeCrownCondition
-has one AssessmentTree
TreeCrownCondition
-has many TreeCrowns
コンテキストのために、モデルのこの部分は、アーボリストが木の冠の状態を記録できるように設計されていることを説明します。これには、ユーザーが編集できる樹冠を評価するためのオプションのリストが格納されます(したがって、TreeCrownConditionsにはオプションが含まれ、TreeCrown.conditionは評価で行われた特定の選択を指します)。
これらのオプションをロードし、didSelectRow:inComponentの次のコードを使用して、選択したオプションをAssessmentTreeに関連付けるUIPickerViewがあります。
TreeCrownCondition *fc = (TreeCrownCondition *)[conditionArray objectAtIndex:[conditionPicker selectedRowInComponent:0]];
tree.crown.condition = fc;
これを実行すると、最初の数回はオプションを選択してすべてが正常ですが、(通常はTreeCrownConditionオプションを追加/編集/削除した後)アプリが上記の行でクラッシュし、最初に投稿したエラーが発生することがあります。
アプリ全体で1つのNSManagedObjectContextのみを使用していることを除けば、エラーは簡単に修正できるようです。新しいコントローラーはそれぞれ、次のコードがロードされたときにそれを取得します。
if(!managedObjectContext){
managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
このエラーやその解決方法に関する情報はあまり見つかりませんでした。また、複数のコンテキストを使用せずにこの問題が発生した人は確かに見つかりませんでした。
どういうわけか複数のコンテキストがあると思いますが、それがどのように可能かわかりません。私は何が欠けていますか?
スタックトレースを編集します。
*** 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'