Core Data Migration — перенос выбранных данных из предыдущей версии

Мы выполняем наше первое обновление приложения для iOS, а также первую миграцию основных данных.

Это кажется более сложным, чем примеры стандартной и упрощенной миграции основных данных, которые я видел в Интернете, но, возможно, я что-то упускаю.

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

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

Любые советы о том, как подойти к этому сценарию, будут очень признательны.

Заранее спасибо, Тед


person Ted    schedule 21.05.2012    source источник


Ответы (2)


База данных ваших пользователей будет обновлена ​​«на месте». Никакой миграции или импорта/экспорта не потребуется. Когда пользователь запустит новую версию вашего приложения, существующая база данных будет обновлена ​​новыми полями. Я не уверен, что это отвечает на ваш вопрос, но никакого «импорта» не будет.

person melsam    schedule 21.05.2012
comment
Привет Мелсам, Спасибо за ваш ответ. Я понимаю, что легкая миграция просто обновит существующую базу данных пользователя. Что я хочу сделать, так это включить в пакет новый файл базы данных, перенести в него пользовательские данные из предыдущей базы данных и затем, наконец, удалить предыдущую базу данных. Я начинаю понимать, что это, возможно, не очень стандартный сценарий миграции Core Data, и прошу прощения, если мой вопрос не блестяще описал ситуацию... - person Ted; 21.05.2012
comment
Извините, я не понял вашего вопроса. То, что вы описываете, кажется гораздо более сложным, чем может справиться легкая миграция. Похоже, что ручное перемещение ваших данных - ваш лучший выбор (т.е. путем инициализации нескольких NSPersistentStoreCoordinator). - person melsam; 21.05.2012
comment
Да, наверное. Я начинаю сожалеть о том, что справочные данные и пользовательские данные теперь хранятся в одном и том же постоянном хранилище... Ба. Спасибо, в любом случае. - person Ted; 21.05.2012
comment
Никогда не поздно внести улучшения в уровень данных. Некоторая боль теперь принесет плоды в будущем. Удачи! Кстати, пожалуйста, проголосуйте, если мой ответ вообще помог :) - person melsam; 21.05.2012

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

Облегченная миграция обновляет модель данных при первом запуске, а затем одноразовый вызов миграции создает и заполняет файл plist пользовательских данных, переименовывает постоянное хранилище основных данных v1 *_migrated.sqlite, копирует базу данных sqlite v2 из пакета в документы. dir, затем сбрасывает MOM и устанавливает для MOM, MOC и постоянного хранилища значение nil, чтобы при следующем запуске Core Data использовала базу данных sqlite v2 в качестве своего постоянного хранилища.

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

person Ted    schedule 25.05.2012