Подтвердить что ты не робот

Как добавить дополнительные атрибуты в существующий основной объект данных?

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

Справка Plz.. Спасибо

4b9b3361

Ответ 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.