如何向现有核心数据实体添加更多属性?

Que*_*kir 16 iphone core-data ios

我有一个使用核心数据的项目,我需要向现有实体(列)添加更多属性(列),如果我手动添加属性到数据模型应用程序崩溃,它是由于我用于将数据插入表的上下文保存先前

Plz帮助..谢谢

chi*_*rag 21

如果要更改现有代码数据模型中的属性,则需要执行以下步骤...请参阅此自定义核心数据迁移

或者这可以帮助您了解如何执行轻量级核心数据迁移

  • 请避免使用网址回复,或者至少粘贴回答问题的要点.你无法保证外部链接永远都在那里...... (26认同)
  • 事实上,第一个链接已经死了 - 坏网关. (5认同)
  • 我正在低估,因为第一个链接已经死了,这严重降低了答案的实用性. (3认同)

小智 5

如果您只是向实体添加属性,则可以使用 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;
Run Code Online (Sandbox Code Playgroud)

如果您的迁移对于轻量级迁移来说过于复杂,您将看到错误。否则,迁移应该运行,并且您的数据库将更新以匹配您的新架构。

请注意,如果您在设备上实际执行此操作,则应首先备份 .sqlite 文件,以防迁移过程中出现问题。


小智 5

所以我的问题是我不知道这个持久存储协调器代码去哪里了。事实证明,AppDelegate当您在创建项目时选中“使用核心数据”时,它会在您的实现中自动创建。

因此,从这里的第二个链接开始,您需要为轻量级迁移(添加新属性等)执行以下操作:

  1. 选择您的 .xcdatamodeld
  2. 从菜单中选择编辑器 -> 添加模型版本
  3. 将新版本命名为您想要的任何名称,在“基于模型”中选择以前的版本
  4. 在 .xcdatamodeld 的 File Inspector 中,选择 Model Version -> Current -> your new model version
  5. 在 Project Navigator 中的 .xcdatamodeld 中选择您的新模型版本,并对您的模型进行更改
  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
}()
Run Code Online (Sandbox Code Playgroud)

因此,您只需向addPersistentStoreWithType呼叫添加迁移选项。