Что мне нужно сделать, чтобы заставить Core Data автоматически переносить модели?

Я прочитал в документации об автоматической / облегченной миграции для моделей Core Data, но у меня проблемы с реализацией его реализации.

Насколько я понимаю, приложение должно заметить, что модель, которую она имеет, и модель, которая существует на устройстве, уже не совпадают. Если у вас есть только добавленные атрибуты или отношения и подобные простые изменения, то модель должна быть обновлена ​​автоматически.

Любые указатели – мне нужно что-то установить в xCode?

Теперь я узнал, что это довольно просто – как только вы знаете, где искать.

В моем AppDelegate я настроил NSPsistentStoreCoordinator – и вам нужно добавить некоторые опции для этого, чтобы сказать, что он обрабатывает автоматическую миграцию:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; NSError *error; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { // Handle error NSLog(@"Problem with PersistentStoreCoordinator: %@",error); } 

Затем вам нужно сделать небольшой трюк в xCode:

  1. Выберите файл xcdatamodel
  2. Выберите меню «Дизайн» вверху – затем «Модель данных», затем выберите «Добавить версию модели»
  3. Затем ваш файл xcdatamodel переместится в новый каталог с тем же именем, что и файл xcdatamodel, но с расширением xcdatamodeld – в этом каталоге будет второй файл с именем 2. Выберите новый файл, а затем Design-> Data Model-> Set Current Version ( в Xcode 4 вы это сделаете )
  4. Если вы уже внесли изменения, которые привели к несовместимости вашего проекта, выполните эти изменения из исходного файла xcdatamodel. Если вам еще нужно внести изменения – тогда просто отредактируйте файл 2.xcdatamodel (тот, который вы только что сделали текущей версией).
  5. Теперь, когда вы устанавливаете эту версию на устройство, имеющее старую модель, оно автоматически обновит эту модель до новой модели.

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

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


ОБНОВЛЕНИЕ (15/07/2011):

Благодаря @ rockstarberlin для указания, есть обновленная документация в apple:

Xcode 4: установка текущей версии управляемой модели объекта

Обновление: 8/19/2013 лучшая ссылка:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmModelFormat.html

Это было невероятно полезно. Документация Apple была, как обычно, крайне неполной. Я рекомендую делать чистую сборку, так как я столкнулся с ошибкой «Не могу объединить модели с двумя разными объектами xxx», когда я впервые запускал после внесения этих изменений. Чистая assembly зафиксировала его.

Ответ Grouchal является идеальным … но если у вас все еще есть «Невозможно объединить модели с двумя разными объектами xxx» даже после нескольких попыток сборки сборки … Возможно, у вас могут быть проблемы с загрузкой managedObjectModel. . Посмотрите на этот …, который помог мне исправить это.

проблемы с первичными данными

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

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

Чтобы ответить на ответ Сантхоша, подумал, что я бы разместил здесь fragment кода. Вам нужно создать свой управляемый объект с initWithContentsOfURL: вместо mergedModelFromBundles: противном случае вы получите ошибку:

Невозможно объединить модели с двумя разными объектами XXX и XXX

Если ваш файл модели называется «Модель», вот как вы создаете managedObjectModel:

 NSString *path = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"]; NSURL *momURL = [NSURL fileURLWithPath:path]; managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 

Благодарим за это сообщение в блоге .

меню в Xcode 4 немного изменилось. Вот описание, как это сделать в Xcode 4:

Xcode 4: установка текущей версии управляемой модели объекта

У меня была эта проблема в течение многих лет, и я пробовал все эти ответы безрезультатно. Сегодня я наконец понял, что я делаю неправильно. Очень простая проблема, но я ее не замечал. При создании более новой версии модели данных, если вы используете столбцы ADDING, обязательно указывайте их как ДОПОЛНИТЕЛЬНЫЕ. Если вы не выполните простую миграцию, это не сработает, потому что новые значения столбца не будут заполнены.

Как только я убедился, что мои новые столбцы отмечены «необязательными», я снова попробовал миграцию, и это сработало.

Я наткнулся на этот пост из-за других проблем, но ошибка была « Конфигурация модели, используемая для открытия магазина, несовместима с той, которая использовалась для создания магазина ».

Вот моя проблема и решение. В моей модели я использовал конфигурации . У меня было несколько объектов, которые хранятся в одном файле, а остальные – во втором файле. (У меня есть некоторые значения по умолчанию, которые могут периодически потребоваться для загрузки, и было бы невероятной болью, чтобы объединить их в целом). Во всяком случае, я создал новую сущность. Программа, казалось, работала нормально, но всякий раз, когда я уходил, у меня была ошибка выше.

Решение заключалось в том, чтобы посмотреть на мои конфигурации, понять, что у меня есть объект, который в настоящее время не находится ни в одной из конфигураций, и добавьте его в один. Бежит как сон.

Это не устранит проблему OP. Но, может быть, какой-то разочарованный человек, который приземляется здесь через google, будет в лодке, в которой я был 🙂

iOS 4.0+

 NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"model" withExtension:@"momd"]; managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

Незначительное редактирование для замечательных инструкций @ Grouchal выше для Xcode версии 5:

Старый: 2. Выберите меню «Дизайн» вверху – затем «Модель данных», затем выберите «Добавить версию модели»

Версия 5+: 2. Выберите меню «Редактор», затем «Добавить версию модели …», введите название своей версии и на основе модели (выберите свою оригинальную модель из списка)

  • Как написать простой метод Ping в Cocoa / Objective-C
  • Выбрать программную строку таблицы таблиц
  • Разработка iPhone: освобожден указатель
  • Можем ли мы пригласить людей использовать наше приложение или отправить запрос друга из приложения через Facebook в iOS 5?
  • Как кодировать Base64 на iPhone
  • Как скопировать объект в объекте c
  • Отправить уведомление в центр уведомлений о горном льве
  • Как вы вычисляете день года на определенную дату в Objective-C?
  • всплывающее меню iPhone, как iPad popover?
  • Эквивалент карты NSArray
  • Как включить / выключить флэш-память iPhone?
  • Interesting Posts

    Добавить новый элемент в массив без указания индекса в Bash

    Прикрепление электронной почты в Lotus Notes 8

    Только значки, отсутствующие на рабочем столе

    Запрос LINQ в DataTable

    Может ли один исполняемый файл быть консольным и графическим приложением?

    Алгоритм для выделения перекрывающихся прямоугольников?

    Импортировать уценку в Onenote

    Как объединить вызов программным способом, когда выполняется другой вызов (конференц-вызов)

    Как десериализовать дочерний объект с динамическими (числовыми) именами клавиш?

    Мой коллега часто закрывает мою машину через ЛВС – как мне ее предотвратить?

    HTML5 Canvas getImageData и одинаковая исходная политика

    Предлагается ли использовать h: outputText для всего?

    Любой ярлык для изменения размера окна до половины верхнего / нижнего экрана?

    Активность запуска Android от службы

    Как использовать onConfigurationChanged () и newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE в android 2.3.3

    Давайте будем гением компьютера.