我有一个使用核心数据的项目,我需要向现有实体(列)添加更多属性(列),如果我手动将属性添加到数据模型应用程序崩溃,这是由于我用来将数据插入表中的上下文保存之前
请帮助..谢谢
所以我的问题是我不知道这个持久存储协调器代码的去向。事实证明,AppDelegate
当您在创建项目时选中“使用核心数据”时,它会在您的实现中自动创建。
因此,从这里的第二个链接,您需要做的所有轻量级迁移(添加新属性等)如下:
如下更改您的 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
调用中添加迁移选项。
如果您只是向实体添加属性,则可以使用 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 文件,以防迁移时出现问题。