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

时间:2013-04-19 07:04:23

标签: iphone ios core-data

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

Plz帮助..谢谢

3 个答案:

答案 0 :(得分:22)

如果您想更改现有代码数据模型中的属性,则需要执行以下步骤...请参阅此customizing-core-data-migrations

或者这可以帮助你批次how-to-perform-a-lightweight-core-data-migration

答案 1 :(得分:4)

如果您只是向实体添加属性,则可以在核心数据中使用自动lightweight migration

基本上,您只需要在添加持久存储时使用适当的选项传递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 :(得分:4)

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

因此,从第二个链接here开始,轻量级迁移(添加新属性等)需要做的就是:

  1. 选择您的.xcdatamodeld
  2. 从菜单中选择编辑器 - >添加模型版本
  3. 将新版本命名为您想要的任何内容,在“基于模型”
  4. 中选择以前的版本
  5. 在.xcdatamodeld的文件检查器中,选择型号版本 - >当前 - >您的新模型版本
  6. 在Project Navigator中的.xcdatamodeld中选择新的模型版本,然后对模型进行更改
  7. 如果您更改了属性名称或类型,请创建映射模型,新文件 - >核心数据 - >映射模型 - >选择源和目标模型版本
  8. 更新新映射模型中的映射
  9. 更改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来电。