核心数据:如何处理新版本?

时间:2012-01-30 16:04:07

标签: objective-c ios core-data

我发布了一个带有Core Data sqlite数据库的应用程序。在我的应用程序的新版本中,我在XCode中创建了我的xcdatamodel的新“模型版本”。在新版本中,将删除实体,并将一些新属性添加到其中一个实体。

更新到新的应用版本时,我收到此sql错误:

  

用于打开商店的模型与用于创建商店的模型不兼容

我该如何处理此错误?数据库中的所有数据都是从Web下载的,因此最简单的方法是在发生此错误时从头开始删除当前的sqlite文件 - 但是当数据库包含无法重新生成的数据时,人们会怎么做? / p>

SOLUTION:

我在Xcode中创建了一个Mapping Model,并更改了我的persistentStoreCoordinator getter来处理addPersistentStoreWithType:configuration:URL:options:error:方法的选项字典,其中包含键NSMigratePersistentStoresAutomaticallyOption

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }

    NSURL *cacheURL = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
    NSURL *storeURL = [cacheURL URLByAppendingPathComponent:@"MyDatabase.sqlite"];
    NSString *storePath = [storeURL path];

    NSError *error = nil;
    NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {        
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return __persistentStoreCoordinator;
}

1 个答案:

答案 0 :(得分:3)

您遇到的问题是您必须将数据从旧的核心数据文件迁移到新的核心数据文件。这就是您在问题中遇到“不兼容”错误的原因。如果您更改核心数据模型,则需要提供旧版本和新版本,并告诉系统如何将数据从旧版本移动到新版本。

要执行此操作,您需要使用核心数据版本控制(使用捆绑包)并创建迁移方案。这是一个复杂的过程,可能很难在这个答案中解释。通常,您可以创建核心数据文件的新版本,它会自动迁移数据,但有时您可能会遇到问题。

最好的办法是在谷歌中查找核心数据版本。快速搜索出现了这个相当全面的教程http://www.timisted.net/blog/archive/core-data-migration/。它看起来很不错。