Недопустимые отношения между объектами в разных контекстах: но у меня только один контекст?

Я получаю следующую ошибку:

'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'
7
задан Evan Cordell 20 August 2010 в 22:44
поделиться

2 ответа

Как вы создаете свои Сущности? Если вы создаете объект без NSManagedObjectContext , это приведет к той же ошибке.

Обновление

Судя по виду вашего кода, я предполагаю, что то, что вы получаете обратно из средства выбора, не является тем, чего вы ожидаете или к чему без необходимости выполняете приведение.

Я бы поставил точку останова на objc_throw_exception и продублировал сбой в отладчике. Как только вы это сделаете, осмотрите объекты, и я надеюсь, вы обнаружите, что то, что вы получаете из средства выбора, не NSManagedObject , а что-то еще.

4
ответ дан 7 December 2019 в 14:26
поделиться

Я видел странные ошибки, подобные этой, часто из-за устаревшего хранилища данных. Вы пытались полностью удалить приложение с сим-карты или устройства (например, удаление с удержанием касания)? Сделайте чистую сборку, затем соберите и запустите.

0
ответ дан 7 December 2019 в 14:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: