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

Posted

技术标签:

【中文标题】核心数据:如何处理新版本?【英文标题】:Core Data: How to handle new versions? 【发布时间】:2012-01-30 16:04:07 【问题描述】:

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

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

开店的型号和开店的型号不兼容

我该如何处理这个错误?数据库中的所有数据都是从网上下载的,所以可能最简单的方法就是在出现这个错误时删除当前的sqlite文件并从头开始——但是当数据库中包含无法重新生成的数据时人们会怎么做呢?

解决方案:

我在 Xcode 中创建了一个映射模型,并更改了我的 persistentStoreCoordinator getter 以处理带有 NSMigratePersistentStoresAutomaticallyOption 键的 addPersistentStoreWithType:configuration:URL:options:error: 方法的选项字典。

- (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】:

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

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

最好的办法是在谷歌中查找核心数据版本。快速搜索一下这个非常全面的教程http://www.timisted.net/blog/archive/core-data-migration/。看起来还不错。

【讨论】:

Apple 关于迁移的文档也非常值得一读——developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/…。遗憾的是,源问题听起来似乎超出了 Core Data 可以自己解决的轻量级转换的范围,但映射模型的东西是完全合适的,即使屏幕截图不是完全最新的。 绝对。 :) 我更喜欢编写良好的教程而不是苹果的文档,但是作为参考点,这是正确的去处! :)

以上是关于核心数据:如何处理新版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何用应用商店中的新版本替换 iOS 应用中预先填充的核心数据?

perUser安装程序如何处理perMachine旧版程序?

您如何处理重构和合并需求之间的紧张关系?

由于第三方库,如何处理 AppStore 警告 - 缺少目的字符串?

如何处理作为 ES6 模块导入的 JavaScript 文件的缓存

在新版本中添加现有实体的新属性时核心数据崩溃