Нелегальные отношения между объектами в разных контекстах: а у меня только один контекст? - PullRequest
7 голосов
/ 17 августа 2010

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

'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'

Ответы [ 3 ]

4 голосов
/ 18 августа 2010

Как вы создаете свои сущности? Если вы создаете сущность без NSManagedObjectContext, она выдаст ту же ошибку.

Обновление

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

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

0 голосов
/ 24 мая 2016

Интересно, что эта ошибка может быть вызвана неправильным объектом NSManaged, вставленным в другой объект NSManaged.

Примерно так: т.е. Оранжевый Apple B // отношение многие к одному

A.b = [NSOrderedset setwithObjects Orange, ноль];

0 голосов
/ 17 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...