在 Core Data 中为实体添加属性

Posted

技术标签:

【中文标题】在 Core Data 中为实体添加属性【英文标题】:Adding attribute to entity in Core Data 【发布时间】:2009-08-03 01:32:30 【问题描述】:

在映射出数据模型中的所有实体/属性/关系后,我创建了所有托管对象。现在我遇到了需要添加其他属性/关系的问题,这是我第一次设计我的一个实体/类时没有想到的。有没有办法用 Core Data 修改我现有的 NSManagedObject 类,而不是擦除我的所有模型并根据新的 xcdatamodel 重新创建它们?

在 xcdatamodel 中添加属性是否也会更新底层存储机制?假设我使用 SQLite3 作为我的持久存储,它会相应地添加列吗?

【问题讨论】:

【参考方案1】:

正如土拨鼠指出的那样,对于数据模型的复杂更改,您需要创建模型的版本并将旧模型下的数据迁移到新模型中,遵循 Apple 关于此事的指南(他链接到该指南)。不用担心任何幕后 SQL,Core Data 会为您处理。

但是,对于简单的数据模型更改,Apple 在 iPhone OS 3.0 的 Core Data 实现中引入了一个名为 lightweight migration 的新功能。对于轻量级迁移,Core Data 将自动迁移数据模型中的简单更改,例如更改属性或实体的名称、删除属性、添加具有默认值的属性或更改实体的继承。您只需在新版本中输入重命名标识符以指向旧版本的名称等。Core Data 将以有效的方式处理您的数据更新,只要您设置 NSMigratePersistentStoresAutomaticallyOption 和 NSInferMappingModelAutomaticallyOption 选项你的持久存储。

【讨论】:

我发现Core Data Migration and Versioning 非常清楚地填补了苹果文档中的空白。 Xcode 中的Design > Data Model > Add Model Version 是我缺少的步骤。 请注意:要为现有对象的新属性设置默认值,您必须取消选中“可选”标志。【参考方案2】:

如果您的意思是“我可以更改我的 xcdatamodel 并将生成的代码中的更改合并到我现有的 NSManagedObject 派生类代码中”,是的,这很简单。您只需为已更改的模型生成代码,然后手动将更改合并到那些特定的派生类中。由于这些更改听起来像是附加的属性和关系,所以这应该是微不足道的 - 事实上,如果您的更改本质上是真正的附加更改,您可能可以使用 diff 和 patch 半自动地执行此操作。

但是,如果您的意思是需要将现有商店迁移到新架构,那么您还有一些工作要做。某些条件(添加正交实体、获取的属性等)不会强迫您这样做。当您尝试将现有的持久存储添加到托管对象上下文的持久存储协调器时,您会意识到是否需要。

在您决定着手进行架构更改之前,您应该始终阅读如何在 Core Data 中执行 migrations and versioning - 如果您有需要保留的现有存储。在将用户数据存储在 Core Data 存储中的应用程序中,几乎可以肯定是这种情况。除非您拥有自动导入工具或数据存储生成实用程序,否则您现有的静态存储也可能需要迁移。

【讨论】:

【参考方案3】:

您还应该查看代沟设计模式。它将在这种情况下为您提供帮助。 Here 是一个关于使用 CoreData 代沟的 SO 问题。

【讨论】:

以上是关于在 Core Data 中为实体添加属性的主要内容,如果未能解决你的问题,请参考以下文章

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

iOS Core Data:使用 Foundation 对象添加属性

iOS开发学习之Core Data

是否有理由不在 Core Data 实体中使用相同的属性名称?

Core Data 无法生成原始访问器

如何在 Core Data 中为多个对象(相同实体类型)生成数组实例?