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




5 Answers

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

В моем 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

ios swift

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

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

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




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

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




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

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

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

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

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




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

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




iOS 4.0+

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



Related