iCloud、Core Data、迁移和模型映射

Posted

技术标签:

【中文标题】iCloud、Core Data、迁移和模型映射【英文标题】:iCloud, Core Data, migration and model mapping 【发布时间】:2011-10-20 14:36:21 【问题描述】:

如Apple documentation中所说

不支持使用映射模型的架构迁移(轻量级 支持迁移)。

我想知道我们有哪些选择,以防我们需要处理 iCloud 功能和映射模型迁移...我知道我将来需要更改我的核心数据模型以向我的应用程序添加功能(而不是仅以轻量级的方式)。问题是我现在不能说需要哪些新实体以及将设置与以前模型实体的哪些关系。

我正在考虑这样的序列:

1 - 启动我的应用程序对我的核心数据模型进行映射迁移

2 - 让它与 iCloud 同步

如果 iCloud 包含适应新模型的事务日志文件,这将起作用。如果是旧的事务日志文件(意味着适应旧模型),它将失败。

为了避免我正在考虑这样做:

1 - 启动我的应用程序,让它与 iCloud 同步

2 - 对我的核心数据模型进行映射迁移

3 - 删除旧的 iCloud 数据并用新数据更新它

如果 iCloud 已经包含更新的事务日志文件(意味着适应新模型),这将不起作用。

我需要一种方法来检查 iCloud 中的事务日志是否与我当前的核心数据模型兼容。有没有办法做到这一点?

谢谢。

【问题讨论】:

似乎可以做的是使用 iCloud 键值来存储模型版本,您可以在创建持久存储协调器或进行模型映射之前检查该版本。我现在想要苹果 iCloud 论坛上的 iPhoneRecipes 示例,它显示 iCloud 和 Core Data 的使用仍然不稳定。同步并不总是成功,有时与 iCloud 的连接会失败。我想在 Apple 更新之前我不会将 iCloud 与 Core Data 结合使用。 【参考方案1】:

我不建议在生产应用中将 Core Data 与 iCloud 一起使用。

它不够稳定。没有简单的方法可以检查应用程序是否在 iCloud 设置中启用/禁用。更不用说如果用户在启用 iCloud 支持后关闭它可能出现的问题。

迁移是另一个问题。轻量级迁移工作得相当好。但是为了使映射模型迁移工作,您需要从现有的 iCloud“ubiquity 文件夹”中清除/驱逐内容,创建一个新的(使用新名称)并更改与 NSPersistentStoreUbiquitousContentURLKey 关联的值。而且,您需要确保所有客户都这样做。它复杂但可行。不确定它是否值得……

关于版本兼容性问题,我还没有尝试过,但一个想法是以某种方式从 iCloud 事务日志中获取存储元数据,并通过 ManagedObjectModel 上的“compatibleWithStoreMetadata”方法检查版本是否匹配:

// Get current model
NSManagedObjectModel *myModel = [self managedObjectModel];

// Check compatibility
BOOL isCompatible = [myModel isConfiguration:nil compatibleWithStoreMetadata: metadataFromTransactionLogEntry];

【讨论】:

以上是关于iCloud、Core Data、迁移和模型映射的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 的推断映射模型创建(轻量级迁移)崩溃。线程问题?

当涉及多个设备时,Core Data iCloud 迁移“丢失”数据

将 Core Data 应用程序迁移到 iCloud

如何在发布更新时启用 iCloud 并迁移 Core Data?

在迁移时从 iCloud 迁移到本地商店崩溃的应用程序“对象不能为零” - 使用 Core Data

Core Data 错误地选择了映射模型