Импорт старой модели CoreData в новый проект

У меня есть старый проект Xcode, который содержит модель CoreData (содержащую версию 1 и версию 2 модели). По нескольким причинам мне нужно создать новый проект Xcode и передать весь код в новый проект.

Как я могу импортировать/переносить мою старую модель CoreData таким образом, что этот новый бинарный файл все равно сможет читать и потенциально переносить существующие хранилища CoreData, которые находятся на iPhone и iPhone для моих существующих пользователей в мире? Я волнуюсь, что если я нажму новую версию с помощью этого нового проекта, то мои пользователи будут обновлять свое приложение до самой новой версии, а затем он выйдет из строя, потому что номера модели или модели не совпадают.

Я не говорю о добавлении новой версии в модель данных в том же приложении. Я понимаю этот процесс. Речь идет о перемещении/импортировании/etc существующей модели данных из старого проекта в новый проект.

Должен ли я просто скопировать файлы и добавить их в мой проект вручную? Нужно ли мне менять настройки в моих настройках сборки, чтобы учесть это?

Ответ 1

В конце концов, так я решил это:

  • Создать новый проект с помощью CoreData​​li >
  • Скопируйте исходный файл модели CoreData в мой новый проект. Добавьте его в проект.
  • Удалить пустую модель CoreData, созданную новым проектом.
  • В настройках проекта, в разделе "Фазы сборки", "Скомпилировать источники", я добавил скопированный файл модели CoreData.

Затем я использовал код, приведенный Скоттом:

[NSManagedObjectModel mergedModelFromBundles:nil]

который автоматически находит все модели и объединяет их. Удалив автоматически сгенерированный и добавив переданный, все будет хорошо.

Ответ 2

Пока вы сохраняете один и тот же идентификатор приложения, ваш новый код заменит двоичный файл для установленных пользователей, сохраняя при этом все их данные нетронутыми. Таким образом, ваш новый проект по сути свопится как новый двоичный файл. После этого вам нужно убедиться, что вы загрузили нужный файл .sqlite, обработали обновления и т.д.

Позвольте мне изменить это немного дальше. У Downvote есть грустные.

Существует таблица ZMETADATA (или ее эквивалент, которая не может дойти до этого), которая имеет всю информацию, необходимую для идентификации вещей. Далее есть хеши, чтобы узнать, существуют ли текущие версии, чтобы могла произойти автоматическая миграция. Если хеш существует и что вы загрузили свою модель с помощью [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]] вместо [NSManagedObjectModel mergedModelFromBundles:nil], тогда все должно быть хорошо.

Ответ 3

Я нашел более простой способ. Я создал новый проект с основными данными, а затем закрыл его, не создавая и не запуская его. Затем я использовал IDE для открытия xcdatamodeld. Текстовый редактор, вероятно, будет работать так же хорошо. Я должен был перейти к контенту. Возможно, это связано с тем, что я использую PHPStorm и пытаюсь сделать проект из этого. Файл, который я хотел изменить, выглядел так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0"   lastSavedToolsVersion="1" systemVersion="11A491" minimumToolsVersion="Automatic"   sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
</model>

Затем я открыл исходный код xcdatamoleld и скопировал каждую вещь между тегами модели в новый файл. Я закрыл файлы и построил проект. Я не копировал фактические данные модели (.storedata).

Одно предостережение. В моем первоначальном проекте я постоянно менял модель и удалял данные модели. Xcode не смог справиться с этим и сбросил различные ошибки. В последний раз, когда я это сделал, я получил предупреждение:

CoreData: warning: Unable to load class named 'Performance' for entity 'Performance'.  Class not found, using default NSManagedObject instead.

Это предупреждение вновь закрепилось в новом проекте, так что в определении модели что-то не так. К счастью, это не вызывает никаких проблем с выполнением. Если у вас нет этого предупреждения, вы можете быть в порядке.

Это было с Xcode 8.2.1, и это был проект Swift.