После добавления новой версии модели Core Data в мое приложение я выполнил легкую миграцию, по-видимому, успешно. Мигрированный файл загружен в порядке, но при первой попытке доступа к атрибуту через определенную связь приложение вылетает с NSRangeException: '*** -[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds [0 .. 35]'
. Эта взаимосвязь отлично работала до миграции. Я знаю из других сообщений, что 4294967295 действительно -1
, но единственное, что я могу идентифицировать с 36 пунктами в моем приложении/данных, это то, что в модели данных имеется 36 общих объектов (для справки, отношения, которые получаются, имеют 58 элементов в его таблице).NSRangeException после миграции данных Core
Вопрос:
Мой вопрос: на основе ошибки я получаю и устранение неполадок, что я сделал ниже, есть тип изменения схемы, которые могли бы пройти легкую миграцию, но коррумпированный данные по пути, приводящие к отмеченному исключению? Я попытаюсь сломать переход на более мелкие куски на несколько версий, чтобы изолировать или избежать проблемы, но было бы неплохо сосредоточиться на конкретных изменениях схемы, которые могут быть ошибочными.
Неудача:
Неудача происходит с помощью следующего кода в «MyObject»:
[[self object2] text];
object2 отношения к одному, не по желанию оба пути и ни вперед, ни обратная связь была изменена между моделями данных. Атрибут text
, вероятно, не имеет значения, поскольку при возникновении ошибки awakeFromFetch
не достигается в объекте2. Если я присвою значение [self object2]
переменной перед вышеуказанным оператором, назначение будет успешным и сообщит data: <fault>
.
База данных:
Глядя на базу данных в sqlite3, я заметил следующее:
- значения индекса для прямых и обратных отношений являются правильными в каждой таблице.
- В таблице object2 есть две колонки для обратной связи, а не одна перед миграцией (
ZMYOBJECT
как и до иZ2_MYOBJECT
, которая пуста для всех строк). Никаких других отношений не было добавлено, чтобы объяснить эту колонку. - В таблице
Z_PRIMARYKEY
все записи после миграции показаны-1
дляZ_MAX
, тогда как до миграции они показали нуль для пустых таблиц и максимального номера строки для заполненных таблиц. Ручное обновлениеZ_MAX
до правильных значений не помогло с исключением. Все значенияZ_SUPER
были верны.
Я установил картографическую модель, чтобы увидеть, что что-то похожее на ошибки с автоматическими сопоставлениями, но все выглядело отлично.
Общая схема изменения:
В версии источника модели данных, было четырнадцать субъектов, из которых были заселены только четыре с данными (приложение находится в стадии разработки). Семь были подразделения высшего уровня, а семь были суб-сущностями трех компаний верхнего уровня.
В целевой версии модели данных были добавлены двадцать два объекта, некоторые верхние и некоторые субистемы, с десятками отношений, в том числе некоторые, добавленные к существующим объектам.
Некоторые атрибуты и отношения были удалены из существующих объектов, а другие были добавлены. Изменены никакие типы данных или настройки отношений, никакие атрибуты или отношения не были переименованы, и никаких специальных сопоставлений не требуется.
Обновление (2/25/12): Когда я начал работать над новой промежуточной моделью, я вспомнил, что я изменил класс (представленное имя класса) для нескольких объектов из NSManagedObject в подкласс NSManagedObject, но не имел генерировал файлы классов. Я не подозревал, что это вызовет проблему, и, действительно, создание всех файлов классов не помогло бы исключение. Я просто хотел отметить это как другое изменение между моделями.
Выводы:
Это дикое предположение, но если число 36 объекта не случайно, кажется, что, когда «MyObject» пытается обвинить в «Object2» он не имеет действительного ссылки для таблицы и пытается загрузить номер таблицы -1, вызывая исключение. Однако тот факт, что простое присвоение [self object2]
является успешным, не подрывает этого вывода.
Любые идеи?
Как вы сделали это, чтобы выбрать свою модель сопоставления? после отключения автоматической миграции? –
@ JoãoNunes После отключения автоматической миграции он должен автоматически выбрать вашу модель сопоставления до тех пор, пока совпадают хеши источника и адресата. Они должны совпадать, если вы не изменили модель данных с момента создания модели сопоставления. К сожалению, иногда это не так, как указано здесь: (http://stackoverflow.com/questions/10894383/core-data-mapping-model-version-hashes-not-matching-to-source-model-version-hash). Включение режима «Отладка основных данных» Режим «Отладка» может помочь устранить проблемы с отображением моделей сопоставления. –
Спасибо за подсказку. Я добавил debug для миграции, но все еще имею проблему. Я создал вопрос здесь: http://stackoverflow.com/questions/17464414/core-data-mapping-model-not-working-with-correct-hashes –