我收到以下错误:
'NSInvalidArgumentException',原因: '非法企图建立一个 关系'条件'之间 不同背景下的对象
运行我的iPhone应用程序时。我模型的相关部分如下所示:
AssessmentTree
-has one TreeCrown
TreeCrown
-has one TreeCrownCondition
-has one AssessmentTree
TreeCrownCondition
-has many TreeCrowns
为了上下文,我将提到该模型的这一部分旨在让树艺师记录树冠的状况。它存储了一个用于评估树冠的选项列表,也可以由用户编辑(So TreeCrownConditions包含选项,TreeCrown.condition指向评估中的特定选择)。
我有一个UIPickerView加载这些选项,并使用didSelectRow中的以下代码将所选选项与AssessmentTree相关联:inComponent:
TreeCrownCondition *fc = (TreeCrownCondition *)[conditionArray objectAtIndex:[conditionPicker selectedRowInComponent:0]];
tree.crown.condition = fc;
当我运行它时,前几次我选择一个选项一切都很好,但有时(通常在添加/编辑/删除TreeCrownCondition选项后)应用程序将在上面的行中崩溃,并在开头发布错误
错误似乎很容易解决,除了我只在整个应用程序中使用一个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'
答案 0 :(得分:4)
您是如何创建实体的?如果您创建的实体没有NSManagedObjectContext
,则会产生相同的错误。
从代码的外观来看,我猜你从挑选者那里得到的东西不是你期望或不必要的东西。
我会在objc_throw_exception
上放置一个断点并在调试器中复制崩溃。一旦你这样做,然后检查对象,我希望你会发现你从选择器中获得的不是NSManagedObject
而是其他东西。
答案 1 :(得分:0)
我看到像这样的奇怪错误通常是由于陈旧的数据存储。您是否尝试过从SIM卡或设备中完全删除该应用(例如点按保留删除)?做一个干净的构建,然后构建并运行。
答案 2 :(得分:0)
有趣的是,这个错误可能是由错误的NSManaged Object插入到另一个NSManaged对象引起的。
这样的事情: 即 橙色A. Apple B //多对一关系
A.b = [NSOrderedset setwithObjects Orange,nil];