علاقة غير قانونية بين الأشياء في سياقات مختلفة: لكن لدي سياق واحد فقط؟

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

سؤال

أحصل على الخطأ التالية:

"nsinvalidargumentexception" ، السبب: "محاولة غير قانونية لإقامة علاقة" شرط "بين الأشياء في سياقات مختلفة

عند تشغيل تطبيق iPhone الخاص بي. الجزء ذي الصلة من النموذج الخاص بي يشبه هذا:

AssessmentTree
-has one TreeCrown

TreeCrown
-has one TreeCrownCondition
-has one AssessmentTree

TreeCrownCondition
-has many TreeCrowns

من أجل السياق ، سأذكر أن هذا الجزء من النموذج مصمم للسماح للمشاجر بتسجيل حالة تاج الشجرة. إنه يخزن قائمة خيارات لتقييم تاج الشجرة الذي يمكن أيضًا تحريره من قبل المستخدم (لذلك يحتوي TreeCrownConditions على الخيارات ، و treecrown.condition يشير إلى التحديد المحدد الذي تم إجراؤه في التقييم).

لديّ uipickerview يقوم بتحميل هذه الخيارات ويربط الخيار المحدد مع التقييم ، باستخدام الكود التالي في didelectrow: غير مكون:

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'
هل كانت مفيدة؟

المحلول

كيف تقوم بإنشاء كياناتك؟ إذا كنت تقوم بإنشاء كيان بدون ملف NSManagedObjectContext سوف ينتج نفس الخطأ.

تحديث

من مظهر الكود الخاص بك ، أظن أن ما ستعود إليه من منتقي ليس ما تتوقعه أو يلقي به دون داع.

أود أن أضع نقطة توقف objc_throw_exception وتكرار الحادث في مصحح الأخطاء. بمجرد القيام بذلك ، تفقد الكائنات وأتوقع أن تجد أن ما تخرج منه من المنتقي ليس ملف NSManagedObject لكن شيء آخر.

نصائح أخرى

لقد رأيت أخطاء غريبة مثل هذه غالبًا ما تكون بسبب متجر بيانات لا معنى له. هل حاولت إزالة التطبيق بالكامل من SIM أو الجهاز (مثل حذف الصنبور)؟ قم ببناء نظيف ، ثم بناء وتشغيل.

ومن المثير للاهتمام ، أن هذا الخطأ يمكن أن يكون ناتجًا عن الكائن الخاطئ الذي تم إدخاله في كائن آخر nsmanaged.

شيء من هذا القبيل: أي البرتقال A Apple b // العديد من العلاقة الواحدة

AB = [nsorderedset setWithObjects Orange ، nil] ؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top