2

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

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

问题:这种迁移是如何使用 Core Data 完成的?可行吗?

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

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

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

谢谢!

4

1 回答 1

11

您应该有两个持久存储。捆绑中的只读存储和文档目录中的读/写存储。

您可以将两个商店都添加到 中,NSPersistentStoreCoordinator并从一个中访问它们NSManagedObjectContext

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

此外,您可以通过确保每个配方具有唯一标识符(您创建的)和注释存储,以便您可以使用获取的属性来检索关联的配方和关联注释,从而将注释“链接”到只读配方。

对象 ID

首先,不要-objectID在商店之间使用 for 链接。它可以并且确实在迁移期间(和其他时间)发生变化,这将使您的迁移比它需要的要丑陋得多

移民

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

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

因为这两个持久存储(及其相关模型)没有链接,所以迁移的风险很小。一个“问题”是 Core Data 的模板代码将无法自动解析源模型以进行迁移。要解决此问题,您需要介入并提供帮助:

  1. 站起来你的目的地NSPersistentStoreCoordinator并注意错误。如果您收到迁移错误:
  2. 找到源模型并NSManagedObjectModel使用所有适当的源模型创建一个实例。
  3. 创建一个实例NSMigrationManager并为其提供源模型和目标模型
  4. 调用- migrateStoreFromURL: type: options: withMappingModel: toDestinationURL: destinationType: destinationOptions: error:启动迁移
  5. 利润!

以这种方式处理迁移需要更多的工作。如果您的两个模型非常分离,您可以做一些不同的事情,但它需要测试(就像所有事情一样):

  1. 捕获迁移错误
  2. 使用需要迁移的持久存储(和模型)来建立 NSPersistentStoreCoordinator的。
  3. 让那个迁移。
  4. 拆掉它NSPersistentStoreCoordinator并尝试再次站起来NSPersistentStoreCoordinator
于 2010-07-15T18:04:44.563 回答