应用更新的核心数据更新模型?

时间:2012-09-05 15:33:52

标签: iphone xcode

使用Core Data的每个人都知道“用于打开商店的模型与用于创建商店的模型不兼容”的消息。

然后我必须从模拟器中删除我的应用程序,然后重新构建它。

我的问题是,如果我提交的应用程序v 1.0,然后在v 1.1中将一些实体添加到核心数据,这是否意味着更新为1.1的1.0用户将清除其数据?

2 个答案:

答案 0 :(得分:1)

您需要为模型创建新的模型版本,然后迁移数据库。如果模型更改在所需更改范围内,则可以执行轻量级迁移。如果没有,您需要告诉核心数据如何迁移数据。查看迁移文档:http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreDataVersioning/Articles/Introduction.html

答案 1 :(得分:1)

在您的情况下,它听起来像是旧数据模型的简单扩展。如果你真的只是添加了一些新的实体甚至是新的类,那么所谓的轻量级迁移是正确的方法。

实际上在这种情况下,您几乎没有任何事情要做,但是将您的第二个模型创建为原始模型。重要的是,你有两个模型,然后应用程序只会加载你的第一个版本没有任何问题以及新版本。

不要忘记将新模型标记为新模型!

在创建新模型时要小心,因为删除模型真的很麻烦。

您的代码与此非常相似:

-(NSManagedObjectContext *)managedObjectContext {
        if (managedObjectContext != nil) {
            return managedObjectContext;
        }
        NSPersistentStoreCoordinator *lC = [self persistentStoreCoordinator];
        if (lC != nil) {
            managedObjectContext =[[NSManagedObjectContext alloc] init];
            [managedObjectContext setPersistentStoreCoordinator: lC];
        }   
        return managedObjectContext;
    }


- (NSPersistentStoreCoordinator *) persistentStoreCoordinator {
    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

    // Allow inferred migration from the original version of the application.
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"DBName.sqlite"]];

    NSError *error = nil;

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl 
                                                        options:options error:&error]){
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);


    }
    return persistentStoreCoordinator;
}

- (NSManagedObjectModel *) managedObjectModel {
    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
    return managedObjectModel;
}