我的iPhone应用程序将具有只读“系统”数据和读/写“用户”数据(使用Core Data或自定义SQLite数据库存储)。用户数据可以参考系统数据。当安装新版本的应用程序时(例如,通过iTunes):
问题:如何使用Core Data进行此类迁移?这可行吗?
例如,假设我的应用程序用于管理食谱。
当用户升级到新版本的应用时,我们希望保留用户评论,并尝试将其与新的“官方”食谱配套食谱重新关联。核心数据是否可行/可行?或许我应该使用简单的“数据库”解决方案(例如,SQLite和传统的创建/读取/更新/删除操作)?
谢谢!的
答案 0 :(得分:11)
你应该有两个持久存储。存储库中的只读存储区和文档目录中的读/写存储区。
您可以将这两个商店添加到NSPersistentStoreCoordinator
,然后从一个NSManagedObjectContext
访问它们。
如果两个商店都有相同的实体,那么您需要调用-assignObject:toPersistentStore:
告诉Core Data将实体保存到哪个商店。如果每个底层模型都有不同的实体,那么这不是必需的。
此外,您可以通过确保每个配方都有一个唯一的标识符(您创建的)来将注释“链接”到只读配方,并且注释会存储这些注释,以便您可以使用获取的属性来检索关联的配方和同事说明。
首先,不要使用-objectID
来连接商店。它可以并且确实在迁移期间(以及其他时间)发生变化,这将使您的迁移 MUCH 更加丑陋。
迁移非常简单。如果您需要更改只读数据模型,只需更改它并在应用程序中包含新版本。
如果您需要更改读写模型,请创建新模型,在测试期间使用自动迁移,并在准备发货时,将旧版本的NSMappingModel
写入新版本。
由于两个持久存储(及其关联模型)未链接,因此迁移风险很小。一个“问题”是Core Data的模板代码无法自动解析迁移的源模型。要解决这个问题,您需要先介绍一下并提供帮助:
NSPersistentStoreCoordinator
并注意错误。如果您收到迁移错误:NSManagedObjectModel
的实例。NSMigrationManager
的实例并为其提供源和目标模型- migrateStoreFromURL: type: options: withMappingModel: toDestinationURL: destinationType: destinationOptions: error:
以启动迁移以这种方式处理迁移还需要做多少工作。如果你的两个模型非常分离,你可以做一点点不同但它需要测试(就像所有事情一样):
NSPersistentStoreCoordinator
。NSPersistentStoreCoordinator
并尝试再次站起主NSPersistentStoreCoordinator
。