Core Data - облегченные миграции и многоядерная модель данных

Мое представленное приложение имеет две модели коред-данных, и я внес некоторые изменения в модель, добавив некоторые атрибуты в текущую модель. поэтому я добавил в модель новую версию и включил облегченную миграцию, но эта ошибка появляется при миграции reason = "Can't find model for source store"

Я следую второму ответу на этот вопрос [Core Data - облегченные миграции и несколько файлов основных моделей данных (xcdatamodel)] [2], и он отлично работает в симуляторе, но не работает на устройствах и вызывает ту же ошибку.

Navigator scrrenshot


person Mustafa Ibrahim    schedule 19.05.2014    source источник
comment
Есть ли у вас две отдельные модели данных или две версии одной и той же модели данных, хотя более поздняя модель данных немного изменена?   -  person andrewbuilder    schedule 19.05.2014
comment
нет двух отдельных моделей данных.   -  person Mustafa Ibrahim    schedule 19.05.2014
comment
но теперь есть одна модель данных, учитывающая ответ, который я приложил к вопросу   -  person Mustafa Ibrahim    schedule 19.05.2014
comment
Не могли бы вы сделать снимок экрана области вашего навигатора проекта в Xcode - убедитесь, что снимок экрана включает контейнер .xcdatamodeld и любые версии? Если необходимо, закройте имя модели, но убедитесь, что каждое расширение пути четко видно.   -  person andrewbuilder    schedule 19.05.2014
comment
@andrewbuilder любезно проверьте скриншот   -  person Mustafa Ibrahim    schedule 19.05.2014
comment
Спасибо @Mustafa - просто исключаю типичные ошибки.   -  person andrewbuilder    schedule 19.05.2014
comment
позвольте нам продолжить обсуждение в чате   -  person andrewbuilder    schedule 19.05.2014


Ответы (1)


Так что, может быть, пошаговое объяснение лучше ...?

Я столкнулся с путаницей при изучении моделей данных, поэтому я представляю свои собственные идеи о проблемах, с которыми я столкнулся во время этой части моего обучения Core Data ... (который, кстати, действительно только начинается в общей схеме. вещей).

Я не могу не подчеркнуть важность чтения пары хороших книг и разработки решения на основе рекомендаций, содержащихся в них ... так что имея это в виду ...

Книгу, которую я часто рекомендую тем, кто интересуется основными данными, находится на книжной полке Pragmatic - «Основные данные, 2-е издание, хранение и управление данными для iOS, OS X и iCloud» (январь 2013 г.) Маркуса С. Зарры и в в частности Глава 3, озаглавленная «Управление версиями и миграция».

Важно понимать, что для успешной миграции Core Data требуются ВСЕ ПРЕДЫДУЩИЕ ОРИГИНАЛЬНЫЕ НЕАКТИВНЫЕ НЕИЗМЕНЕННЫЕ ВЕРСИИ модели данных.

Почему?

Пример...

  • user1 обновляется каждый раз, когда выпускается новая версия приложения, однако в последнем обновлении это коррелирует с третьей самой старой версией модели данных.
  • user2 не обновлял приложение четыре месяца - три выпуска / версии App Store назад, что совпадает с седьмой самой старой версией модели данных.
  • user3 использовал телефон Android, осознал свою ошибку и вернулся к своему iPhone 4 с вашим приложением, установленным, но не обновленным в течение одного года, что соответствует девятнадцатой самой старой версии модели данных, когда приложение использовало два разных данных модельные контейнеры.

Итак, как Core Data узнать, как перенести базу данных SQLite из предыдущего приложения в текущую версию, чтобы база данных работала с кодом в вашем приложении?

(Теперь я не совсем понимаю это, поэтому, пожалуйста, простите мое незнание, но) я понимаю, что Core Data использует значения со знаком хеширования предыдущих версий вашей модели данных, чтобы определить, какую модель данных использует ваше приложение в настоящее время, и на основе этого , применяет миграцию для обновления вашей модели данных - и вот важная часть - ОДНА ВЕРСИЯ МОДЕЛИ ДАННЫХ ЗА ВРЕМЯ!

Это очень важно понять. Когда вы это понимаете, вы понимаете, что для успешной миграции Core Data требуется ВСЕ предыдущие версии модели данных, без изменений. Каждая предыдущая версия модели данных требуется для успешного завершения каждого шага в процессе миграции.

Давайте рассмотрим мой пример.

Когда они загружают обновление приложения и запускают приложение в первый раз после этого последнего обновления:

  • Версия приложения user1 имеет три версии модели данных, которые необходимо перенести, чтобы получить базу данных SQLite, которая соответствует последней модели данных.
  • Версия приложения user2 имеет семь версий модели данных, которые необходимо перенести, чтобы получить базу данных SQLite, которая соответствует последней модели данных.
  • Версия приложения user3 имеет девятнадцать версий модели данных для миграции, но, чтобы добавить к этому, две предыдущие модели данных должны объединиться между моделями данных версии 10 и моделями данных версии 11 (например), чтобы получить базу данных SQLite, которая согласована с последняя модель данных.

Итак, если вы удалите или измените любой из контейнеров или версий предыдущей модели данных, как Core Data узнать, как успешно выполнить миграцию?

Имея это в виду, я даю следующий совет ...

  • Сохраните ВСЕ предыдущие модели и версии данных в соответствующих .xcdatamodeld контейнерах.
  • Если у вас есть несколько моделей данных, которые необходимо перенести, сохраните ОРИГИНАЛЬНЫЕ версии этих .xcdatamodeld контейнеров данных и при необходимости используйте соответствующие методы Core Data для объединения контейнеров.

Отвечая на этот вопрос, я подозреваю, что на каком-то этапе вы изменили контейнеры или версии предыдущей модели данных, чтобы они соответствовали вашему тестированию на симуляторе. При тестировании на устройстве «разные» хеш-подписанные значения для моделей данных на устройстве не соответствуют чему-либо, что остается в контейнерах версии вашей модели данных, и поэтому Build & Run выдает ошибку, которую вы отметили в своем вопросе.

Мой совет - перестроить контейнеры версий вашей модели данных (файлы .xcdatamodeld) в том виде, в котором они были, чтобы позволить Core Data правильно мигрировать через все предыдущие версии (и при необходимости объединять контейнеры модели) для получения соответствующей и последней базы данных SQLite.

Надеюсь это поможет.

Сообщите мне, если я промахнулся, и я продолжу расследование.

person andrewbuilder    schedule 21.05.2014