如何向现有核心数据实体添加更多属性?
我有一个使用核心数据的项目,我需要向现有实体(列)添加更多属性(列),如果我手动添加属性到数据模型应用程序崩溃,它是由于我用于将数据插入表的上下文保存先前
Plz帮助..谢谢
如果要更改现有代码数据模型中的属性,则需要执行以下步骤…请参阅此自定义核心数据迁移
或者这可以帮助您完成如何执行轻量级核心数据迁移
如果只是向实体添加属性,则可以在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文件,以防迁移出现问题。
所以我的问题是我不知道这个持久存储协调器代码在哪里。 事实certificate,当您在创建项目时选中“使用核心数据”时,它会在您的AppDelegate
实现中自动创建。
因此,从这里的第二个链接,您需要做的所有重量轻量迁移(添加新属性等)如下:
- 选择你的.xcdatamodeld
- 从菜单中选择Editor – > Add Model Version
- 将新版本命名为您想要的任何名称,在“基于模型”中选择以前的版本
- 在.xcdatamodeld的File Inspector中,选择Model Version – > Current – >您的新模型版本
- 在Project Navigator中的.xcdatamodeld中选择新的模型版本,然后对模型进行更改
- 如果更改了属性名称或类型,请创建映射模型,新文件 – >核心数据 – >映射模型 – >选择源和目标模型版本
- 更新新映射模型中的映射
更改AppDelegate持久性存储协调器代码,如下所示。
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent(".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
调用。
- iPhone / iPod Touch:应用程序可执行文件包含不受支持的体系结构:armv7s(-19031)
- Facebook的iOS SDK – 发送一个Facebook用户的应用程序请求
- 访问由UIImagePickerController – iOS / iPhone拍摄的图像的元数据(exif标签)
- 在XCode 4中使用Google Analytics libbuild立项目的问题
- IOS中的video编辑库
- 在Objective-C中,如何从类别访问私有财产
- 如何将数据string转换为iOS中的json对象和string?
- 如何定义预处理器macros来检查iOS版本
- 重置iPhone应用程序的钥匙串