2013-04-19 2 views
11

У меня есть проект, который использует основные данные, мне нужно добавить дополнительные атрибуты (столбцы) к существующей сущности (столбец), если я вручную добавлю атрибут к крушению приложения модели данных, и это связано с сохранением контекста, который я использовал для вставки данных в таблицу ранееКак добавить дополнительные атрибуты в существующий объект данных ядра?

Plz помочь .. Спасибо

ответ

21

Если вы хотите изменить атрибуты в существующей модели данных коды, то вам необходимо выполнить несколько шагов ... Пожалуйста, обратитесь к этим customizing-core-data-migrations

Или это поможет вам собрать how-to-perform-a-lightweight-core-data-migration

+0

Это помогло вам! –

+12

Пожалуйста, избегайте отвечать на URL-адреса или, по крайней мере, вставляйте основные моменты, которые отвечают на вопрос. Вы не можете гарантировать, что внешняя ссылка всегда будет там ... – dooleyo

+1

И, по сути, первая ссылка мертва - Bad Gateway. – rattletrap99

4

Если вы добавляете атрибуты только к сущности, вы можете использовать автоматическое lightweight migration в 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, если что-то пойдет не так в процессе миграции.

2

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

Таким образом, из второго звена here, все, что вам нужно сделать для легкого переноса (добавление новых атрибутов и таких) является следующее:

  1. Выберите .xcdatamodeld
  2. Из меню , выберите «Редактор» -> Добавить версию модели
  3. Назовите новую версию, что угодно, выберите предыдущую версию в «Основано на модели»
  4. В Файловом инспекторе .xcdatamodeld выберите Model Version -> Current -> your new model версия
  5. Выберите новую версию модели внутри .xcdatamodeld в Project Navigator и внесите изменения в свою модель
  6. Если вы изменили имена или типы атрибутов, создайте модель сопоставления, новый файл -> Основные данные -> Модель сопоставления -> выбрать источник и модель назначения версии
  7. Обновления отображение в новой модели отображения

Изменить свой 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's 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's 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.

Смежные вопросы