如何使iPhone应用程序容忍Core Data架构更改

时间:2011-01-19 06:56:03

标签: iphone core-data mapping-model

我有一个广泛使用CoreData API的应用程序。我正在开发一个更新版本,为实体添加一些字段。我的应用程序在加载时崩溃(除非我吹掉私有存储并再次启动)因为架构更改。

问题是当客户升级到新版本时,我不介意在第一次加载应用程序时对其数据运行升级程序,但我甚至无法加载它,因为CoreData不喜欢它架构发生了变化。

有没有办法告诉CoreData“它确定..不要担心架构更改”?因为我只添加了字段而没有重命名或删除任何内容。

1 个答案:

答案 0 :(得分:6)

你应该得到一份Marcus Zarra的核心数据书,并阅读有关迁移的内容(第5章)。但是,如果不这样做,有一些很好的基础知识。首先,您需要在更新的应用中使用旧模型(架构)和新模型。其次,您需要确保将新模型标记为“当前模型”。第三,您需要确保创建NSPersistentStoreCoordinator,使其自动从现有模型(从磁盘加载)映射到新模型。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
    {
    if (persistentStoreCoordinator)
        return persistentStoreCoordinator;

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyDataStore.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

    // Use mapping model
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil];


    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                configuration:nil
                                URL:storeUrl
                                options:options
                                error:&error])
        {
        [NSApp presentError:error];
        }
    return persistentStoreCoordinator;
    }

<强>更新 新应用中的旧模型需要完全与旧应用中的模型相同。如果您不确定是这种情况,那么您可以采取一些步骤来确保。我这样做的方式有点涉及 - 但如果您认为这样做会有所帮助,我会概述它。