Импорт старой модели CoreData в новый проект - PullRequest
11 голосов
/ 17 марта 2012

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

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

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

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

Ответы [ 3 ]

11 голосов
/ 28 марта 2012

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

  1. Создание нового проекта с CoreData
  2. Скопируйте необработанный файл модели CoreData в мой новый проект.Добавьте его в проект.
  3. Удалите пустую модель CoreData, автоматически созданную новым проектом.
  4. В настройках проекта в разделе «Фазы сборки», «Компилировать источники» я добавил скопированный файл модели CoreData.

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

[NSManagedObjectModel mergedModelFromBundles:nil]

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

2 голосов
/ 17 марта 2012

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

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

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

0 голосов
/ 14 января 2017

Я нашел более простой способ.Я создал новый проект с основными данными, а затем закрыл его, не создавая и не запуская его.Затем я использовал 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.

...