为什么添加属性时CoreData会崩溃?

时间:2010-11-13 21:37:16

标签: iphone core-data attributes object-model

每次我向CodeData对象模型添加一个新属性时,我必须清除我的数据库文件,否则会出现以下错误:

  

2010-11-13 15:26:44.580 MyApp [67066:207] * 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'+ entityForName:无法找到实体的NSManagedObjectModel名称'myApp''

必须有一种方法可以在不丢失整个数据库的情况下添加额外的字段。

我需要做些什么来保留我的数据?

2 个答案:

答案 0 :(得分:13)

有一种方法,这种方式称为自动轻量级迁移。在更改对象模型时,它需要代码更改和额外步骤。

对于代码,您必须为初始化持久性存储协调器的方法添加两个选项。像这样的东西:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }
    NSString *storePath = [AppDelegate_Shared coredataDatabasePath];
    NSURL *storeURL = [NSURL fileURLWithPath:storePath];

// important part starts here
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
                             nil];
    NSError *error = nil;
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
// and ends here

        LogError(@"Unresolved error %@, %@", error, [error userInfo]);
        // Do something 
    }    
    return persistentStoreCoordinator_;
}

现在,如果要更改模型,则必须在进行任何更改之前创建模型版本 选择您的数据模型,然后进入主菜单Design -> Data Model -> Add Model Version。您的“旧”模型将被重命名,您可以在当前模型中进行更改,即带有绿色标记的模型 所有旧模型都会保留并存入您的应用程序,因此您的应用程序可以执行“自动轻量级迁移”并将现有数据库升级到新模型。

答案 1 :(得分:1)

除了@Matthias Bauch 的回答

对于 Xcode 12.3

从主菜单中选择 Editor -> Add Model Version

enter image description here

使用绿色复选标记添加将新模型标记为当前模型 按照下图

enter image description here