Так что, может быть, пошаговое объяснение лучше ...?
Я столкнулся с путаницей при изучении моделей данных, поэтому я представляю свои собственные идеи о проблемах, с которыми я столкнулся во время этой части моего обучения 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