Core Data能否处理我的“系统与用户数据”迁移需求?

时间:2010-07-15 17:03:21

标签: iphone core-data data-migration

我的iPhone应用程序将具有只读“系统”数据和读/写“用户”数据(使用Core Data或自定义SQLite数据库存储)。用户数据可以参考系统数据。当安装新版本的应用程序时(例如,通过iTunes):

  • 更新附带的系统数据应覆盖/替换系统数据
  • 应修改用户数据以引用系统数据(如果可能)。

问题:如何使用Core Data进行此类迁移?这可行吗?

例如,假设我的应用程序用于管理食谱。

  • 每个版本的应用都会附带一套默认食谱。
  • 用户可以编辑这些“官方”食谱。
  • 但是,开发者可能会在应用的未来版本中修改(或删除)任何“官方”食谱。
  • 允许用户在“官方”食谱中添加注释/评论(例如,“烘烤45分钟而不是30分钟”)。

当用户升级到新版本的应用时,我们希望保留用户评论,并尝试将其与新的“官方”食谱配套食谱重新关联。核心数据是否可行/可行?或许我应该使用简单的“数据库”解决方案(例如,SQLite和传统的创建/读取/更新/删除操作)?

谢谢!

1 个答案:

答案 0 :(得分:11)

你应该有两个持久存储。存储库中的只读存储区和文档目录中的读/写存储区。

您可以将这两个商店添加到NSPersistentStoreCoordinator,然后从一个NSManagedObjectContext访问它们。

如果两个商店都有相同的实体,那么您需要调用-assignObject:toPersistentStore:告诉Core Data将实体保存到哪个商店。如果每个底层模型都有不同的实体,那么这不是必需的。

此外,您可以通过确保每个配方都有一个唯一的标识符(您创建的)来将注释“链接”到只读配方,并且注释会存储这些注释,以便您可以使用获取的属性来检索关联的配方和同事说明。

的ObjectID

首先,不要使用-objectID来连接商店。它可以并且确实在迁移期间(以及其他时间)发生变化,这将使您的迁移 MUCH 更加丑陋。

移植

迁移非常简单。如果您需要更改只读数据模型,只需更改它并在应用程序中包含新版本。

如果您需要更改读写模型,请创建新模型,在测试期间使用自动迁移,并在准备发货时,将旧版本的NSMappingModel写入新版本。

由于两个持久存储(及其关联模型)未链接,因此迁移风险很小。一个“问题”是Core Data的模板代码无法自动解析迁移的源模型。要解决这个问题,您需要先介绍一下并提供帮助:

  1. 站起来NSPersistentStoreCoordinator并注意错误。如果您收到迁移错误:
  2. 查找源模型并使用所有相应的源模型创建NSManagedObjectModel的实例。
  3. 创建NSMigrationManager的实例并为其提供源和目标模型
  4. 致电- migrateStoreFromURL: type: options: withMappingModel: toDestinationURL: destinationType: destinationOptions: error:以启动迁移
  5. 利润!
  6. 以这种方式处理迁移还需要做多少工作。如果你的两个模型非常分离,你可以做一点点不同但它需要测试(就像所有事情一样):

    1. 抓住迁移错误
    2. 使用 需要迁移的持久存储(和模型)站起来 new NSPersistentStoreCoordinator
    3. 让那个人迁移。
    4. 删除NSPersistentStoreCoordinator并尝试再次站起主NSPersistentStoreCoordinator