【问题标题】:Illegal relationship between objects in different contexts: but I only have one context?不同上下文中对象之间的非法关系:但我只有一个上下文?
【发布时间】:2011-03-31 02:52:08
【问题描述】:

我收到以下错误:

'NSInvalidArgumentException',原因: '非法尝试建立一个 之间的关系“条件” 不同上下文中的对象

运行我的 iPhone 应用程序时。我的模型的相关部分如下所示:

AssessmentTree
-has one TreeCrown

TreeCrown
-has one TreeCrownCondition
-has one AssessmentTree

TreeCrownCondition
-has many TreeCrowns

为了方便起见,我将提到模型的这一部分旨在让树艺师记录树冠的状况。它存储用于评估树冠的选项列表,用户也可以编辑这些选项(因此 TreeCrownConditions 包含选项,TreeCrown.condition 指向评估中所做的特定选择)。

我有一个 UIPickerView 加载这些选项并将所选选项与 AssessmentTree 相关联,使用 didSelectRow: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'

【问题讨论】:

标签: iphone core-data nsmanagedobjectcontext


【解决方案1】:

有趣的是,这个错误可能是由错误的 NSManaged 对象插入另一个 NSManaged 对象引起的。

类似这样的: IE 橙色A Apple B //多对一关系

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

【讨论】:

    【解决方案2】:

    您是如何创建实体的?如果您创建的实体没有NSManagedObjectContext,则会产生相同的错误。

    更新

    从您的代码的外观来看,我猜测您从选择器中返回的不是您期望的或不必要的转换。

    我会在objc_throw_exception 上放置一个断点并在调试器中复制崩溃。一旦你这样做了,然后检查对象,我希望你会发现你从选择器中得到的不是NSManagedObject,而是别的东西。

    【讨论】:

    • 它们都是用上下文创建的。你可以在这里看到完整的代码:github.com/ecordell/landscapes/blob/master/Classes/…
    • 顺便说一句;您在此代码中进行的强制转换是不必要的,为了代码清晰起见,应将其删除。例如TreeOverallRecommendation *fc = (TreeOverallRecommendation *)[recommendationArray objectAtIndex:[recommendationPicker selectedRowInComponent:0]]; 是不必要的演员表。 -objectAtIndex: 像 Objective-C 中的大多数方法一样返回一个不需要强制转换的 id
    • 我已经拉下了源代码。如何复制错误?
    • 啊,谢谢,我是 objc 的新手。当您编译并运行时,转到评估,单击或添加记录,然后单击“输入”并单击红色或蓝色编号按钮之一(覆盖在树上)。然后使用加号按钮添加新记录,然后使用 uipickerview 选择不同的条目。这几乎总是会导致错误,但有时我必须添加、编辑或删除几次,然后再次选择。
    • 我无法在模拟器中复制崩溃。您能否显示崩溃的堆栈跟踪?显示导致崩溃的代码行?
    【解决方案3】:

    我见过这样的奇怪错误通常是由于数据存储过时造成的。您是否尝试过从 sim 卡或设备中完全删除该应用程序(例如长按删除)?进行干净的构建,然后构建并运行。

    【讨论】:

    • 我试过了,但在你的建议下我又试了一次,却收到同样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2010-12-05
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多