Как добавить дополнительные атрибуты в существующий основной объект данных?
У меня есть проект, который использует основные данные, мне нужно добавить больше атрибутов (столбцов) в существующую сущность (столбец), если я вручную добавлю атрибут к краху приложения модели данных, и это связано с сохранением контекста, который я использовал для вставки данные в таблицу ранее
Справка Plz.. Спасибо
Ответы
Ответ 1
Если вы хотите изменить атрибуты в существующей модели данных кода, вам необходимо выполнить некоторые шаги... Пожалуйста, обратитесь к этому customizing-core-data-migrations
Или это поможет вам много how-to-perform-a-lightweight-core-data-migration
Ответ 2
Если вы добавляете атрибуты только к сущности, вы можете использовать автоматическую облегченную миграцию в Core Data.
В основном все, что вам нужно сделать, это передать экземпляр NSDictionary
с соответствующими параметрами при добавлении постоянного хранилища. Здесь фрагмент кода с конца метода доступа для _persistentStoreCoordinator
:
NSNumber *optionYes = [NSNumber numberWithBool:YES];
NSDictionary *options = [NSDictionary dictionaryWithObjects:@[optionYes] forKeys:@[NSMigratePersistentStoresAutomaticallyOption]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
NSLog(@"Error opening persistent store: %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
Если ваша миграция слишком сложна для облегченной миграции, вы увидите сообщение об ошибке. В противном случае миграция должна выполняться, и ваша база данных будет обновлена в соответствии с вашей новой схемой.
Обратите внимание, что если вы делаете это на самом деле на устройстве, сначала необходимо создать резервную копию файла .sqlite, если в процессе миграции произойдут что-то не так.
Ответ 3
Итак, моя проблема заключалась в том, что я понятия не имел, куда идет этот постоянный код координатора магазина. Оказывается, он автоматически создается в вашей реализации AppDelegate
, когда вы проверяете "Использовать основные данные" при создании проекта.
Итак, из второй ссылки здесь все, что вам нужно сделать для легкой миграции (добавление новых атрибутов и т.д.), следующее:
- Выберите свой .xcdatamodeld
- В меню выберите "Редактор" → "Добавить версию модели"
- Назовите новую версию, что угодно, выберите предыдущую версию в "На основе модели"
- В "Инспекторе файлов".xcdatamodeld выберите "Версия модели" → "Текущий" → версия вашей новой версии
- Выберите новую версию модели внутри .xcdatamodeld в Project Navigator и внесите изменения в свою модель.
- Если вы изменили имена или типы атрибутов, создайте модель сопоставления, новый файл → Основные данные → Модель сопоставления → выберите исходные и целевые версии модели
- Обновить отображение в новой модели сопоставления
Измените код координатора постоянного хранилища AppDelegate следующим образом.
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("<data model name>.sqlite")
var error: NSError? = nil
var failureReason = "There was an error creating or loading the application saved data."
let options = [
NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true]
if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options, error: &error) == nil {
coordinator = nil
// Report any error we got.
var dict = [String: AnyObject]()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application saved data"
dict[NSLocalizedFailureReasonErrorKey] = failureReason
dict[NSUnderlyingErrorKey] = error
error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog("Unresolved error \(error), \(error!.userInfo)")
abort()
}
return coordinator
}()
Таким образом, вы добавляете только параметры миграции в вызов addPersistentStoreWithType
.