Базовые данные: миграция сущностей с самореферентными свойствами

Моя модель Core Data содержит объект Shape с двумя самореферентными отношениями, что означает четыре свойства. Одна пара представляет собой связь «один ко многим» (Shape.containedBy ‹->> Shape.contains), а другая — связь «многие ко многим» (Shape.nextShapes ‹‹->> Shape.previousShapes). Все это отлично работает в приложении, поэтому я не думаю, что отношения с ссылками на самих себя являются проблемой в целом.

Однако, когда дело доходит до переноса модели на новую версию, Xcode не может скомпилировать автоматически сгенерированную модель сопоставления с этим сообщением об ошибке:

2009-10-30 17:10:09.387 mapc[18619:607] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "FUNCTION($manager ,'destinationInstancesForSourceRelationshipNamed:sourceInstances:' , 'contains' , $source.contains) == 1"'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00007fff80d735a4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x00007fff83f0a313 objc_exception_throw + 45
    2   Foundation                          0x00007fff819bc8d4 _qfqp2_performParsing + 8412
    3   Foundation                          0x00007fff819ba79d +[NSPredicate predicateWithFormat:arguments:] + 59
    4   Foundation                          0x00007fff81a482ef +[NSExpression expressionWithFormat:arguments:] + 68
    5   Foundation                          0x00007fff81a48843 +[NSExpression expressionWithFormat:] + 155
    6   XDBase                              0x0000000100038e94 -[XDDevRelationshipMapping valueExpressionAsString] + 260
    7   XDBase                              0x000000010003ae5c -[XDMappingCompilerSupport generateCompileResultForMappingModel:] + 2828
    8   XDBase                              0x000000010003b135 -[XDMappingCompilerSupport compileSourcePath:options:] + 309
    9   mapc                                0x0000000100001a1c 0x0 + 4294973980
    10  mapc                                0x0000000100001794 0x0 + 4294973332
)
terminate called after throwing an instance of 'NSException'
Command /Developer/usr/bin/mapc failed with exit code 6

«Содержит» — это имя одного из самореферентных свойств. Во всяком случае, действительно большая проблема заключается в том, что я не могу даже посмотреть на это свойство сопоставления, поскольку Xcode аварийно завершает работу, как только я выбираю сопоставление объектов при просмотре модели сопоставления. Так что я немного потерял действительно куда идти отсюда. Я действительно не могу удалить самореферентные свойства, поэтому я думаю, что мне нужно вручную создать модель сопоставления, которая компилируется? Любые идеи?

Ваше здоровье


person Daniel Thorpe    schedule 30.10.2009    source источник
comment
Когда вы говорите о переносе модели на новую версию, это новая версия приложения, Xcode, ОС?   -  person TechZen    schedule 30.10.2009
comment
Я полагаю, что он пытается создать автоматическое сопоставление миграции с новой схемой модели CoreData — при создании более новой версии своего приложения он изменил схему и хочет, чтобы более новое приложение перенесло старые данные в новую схему. Я думаю.   -  person mbauman    schedule 31.10.2009
comment
Да, это точно. Я обновил свою схему Core Data и не хочу потерять содержимое моего хранилища данных, поэтому мне нужно перенести текущее хранилище данных на новую версию моей схемы. Я начинаю думать, что на самом деле это ошибка в Xcode, особенно при декодировании/компиляции файла отображения модели с рефлексивными отношениями, которые генерируют какой-то бесконечный цикл... Я собираюсь спросить о какао-dev, отпишусь здесь, если получу ответ там.   -  person Daniel Thorpe    schedule 02.11.2009


Ответы (1)


Итак, кажется, что «содержит» может быть зарезервированным словом, и поэтому его нужно экранировать с помощью «#». Документация Apple при миграции специально не упоминают его как зарезервированное слово, хотя они также не говорят, каков окончательный список.

Но кажется, что имя свойства не может совпадать с любым именем метода NSObject или NSManagedObject, например, «описание» и, по-видимому, «содержит».

person Daniel Thorpe    schedule 21.11.2009