iOS 上的 CoreData 轻量级迁移失败

Posted

技术标签:

【中文标题】iOS 上的 CoreData 轻量级迁移失败【英文标题】:CoreData lightweight migration failing on iOS 【发布时间】:2011-06-19 13:59:15 【问题描述】:

我正在尝试将我的核心数据数据迁移到新版本。我所做的唯一更改是添加一个字段(NSString *sessionId)

所以我做了什么: 1.创建我的核心数据文件的版本2 2. 在这个文件中添加 sessionId。 3. 将版本 2 设置为默认值。 4.在Offer.m和.h中添加sessionId 5. 初始化persistentStoreCoordinator时添加选项:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                       [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                       [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

当我启动我的应用程序时,我认为它会得到我得到的更新模型:

未解决的错误错误 域=NSCocoaErrorDomain 代码=134130 “手术无法完成。 (可可错误 134130。)" 用户信息=0x7643200 URL=/用户/ei/库/应用程序 支持/iPhone Simulator/4.0.2/Applications/81B816AE-5CA0-46DB-83E7-6A765EBF9D05/Documents/Offers.sqlite, metadata=type = immutable dict, 计数 = 7,

紧随其后

reason=找不到源存储的模型

如果我在加载persistentStoreCoordinator 时没有设置选项,我会得到同样的错误 我错过了什么?

【问题讨论】:

你确定模拟器上安装的应用程序是旧版本的吗?确定改版后没有更新模型吗? 【参考方案1】:

显然,如果您合并两个模型,然后尝试自动从一个模型迁移到另一个模型是行不通的。我们最终将它们分开。

【讨论】:

【参考方案2】:

错误消息的含义与它所说的完全相同:它缺少用于保存数据库的 .xcdatamodel(或严格来说是 .mom)。我会尝试从旧版本中获取 .xcdatamodel 并查看是否有意外更改。

另一个问题是 Xcode 不擅长删除不再构建的文件,无论是在构建时还是在安装时(Xcode 允许进行“增量安装”以加快开发速度,至少在以前的版本中,从未删除文件)。它现在不是构建 MyApp.app/MyModel.mom,而是构建 MyApp.app/MyModel.momd/MyModel.mom,但旧的 MyModel.mom 可能会留下来混淆您用来加载模型的任何内容(通常它会抱怨关于无法合并模型,虽然......)。修复方法是使用 OTA/iPhone 配置实用程序/iTunes 对构建目录进行核对并安装应用程序(按照用户友好性的顺序),顺便说一下,为什么我告诉 Xcode 4 将构建产品粘贴在项目目录中(他们为什么改变它大概是因为人们不够聪明,不会提交它......)。

【讨论】:

它在那里,但我认为问题在于我将两个单独的模型合并为一个。 managedObjectModel_ = [[NSManagedObjectModel modelByMergingModels:[NSArray arrayWithObjects:managedObjectModelOffers_, managedObjectModelLogging_, nil]] 保留];我正在使用第三方 api 进行日志记录功能,这就是为什么我合并两个而不是在一个文件中定义它们。这可以通过某种方式解决吗? 这应该仍然有效,但一个简单的解决方法是为日志记录 API 使用不同的 PSC/MOC。 不幸的是,该应用程序已经在应用程序商店中上线,并且将 PSC/MOC 更改为单独的日志记录会导致崩溃:“用于打开商店的模型与使用的模型不兼容创建商店”

以上是关于iOS 上的 CoreData 轻量级迁移失败的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 版本控制和阻塞轻量级迁移

iOS CoreData 版本升级和数据库迁移

核心数据自动轻量级迁移在 ios5 上失败

Core Data 轻量级迁移 - 现有实体是不是添加了新属性?

CoreData 轻量级迁移 + 自定义

如何在 Swift 中进行轻量级 CoreData 迁移