2

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

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

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

4

2 回答 2

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;
}
于 2012-09-05T16:39:00.233 回答
1

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

于 2012-09-05T15:40:35.300 回答