如何在 Objective-C 中动态创建实体?

Posted

技术标签:

【中文标题】如何在 Objective-C 中动态创建实体?【英文标题】:How to create Entity dynamically in Objective-C? 【发布时间】:2010-11-30 14:15:51 【问题描述】:

我正在构建一个 iPad 应用程序,我需要用户在其中动态创建实体。我已经有 3 个实体可供程序使用。 你能帮我写代码吗?

我想根据我的理解来了解整个结构,我必须创建新的 managedObjectModel,添加新的实体,而不是将它与现有的合并,对吗?

【问题讨论】:

【参考方案1】:

虽然在实践中可以动态创建新实体和新模型,但这非常复杂。如果不出意外,您必须将任何现有的持久数据迁移到新模型和新的持久存储文件。我强烈建议您不要尝试这样做,尤其是在您刚开始使用 Core Data 时。

你确实有选择:

首先,您确定您确实需要一个新实体吗?刚开始使用 Core Data 的人经常将实体误认为托管对象。实体之于托管对象,就像类之于实例一样。实体是用于创建对象图的抽象。它们实际上不包含数据。您需要新实体的时候非常非常罕见。

其次,如果您确实需要某种动态实体,通常最好将动态实体分解为许多固定的子实体,然后使用关系创建一个虚拟实体。例如。您需要一个动态的 Person“实体”,因此您在模型中创建了多个实体,每个实体都包含该人的一个属性。你可以有一个Field 实体,它有一个fieldName 属性,然后是一个fieldValue 属性。然后有一个实际的 Person 实体,它没有属性,但只是与必要的 Field 对象的关系。您可以向任何人添加所需的任何字段,然后通过将关系移至其字段来重构虚拟人对象。

不过,我很怀疑您是否需要这种灵活性。这种需求是非常罕见的。我会退后一步,看看您认为用户可能需要输入哪些动态数据。

【讨论】:

+1 我认为您推断出 OP 在需要添加另一个托管对象(常见)和需要添加另一个实体(非常罕见)之间感到困惑是正确的。【参考方案2】:

没错——您将创建一个 NSEntityDescription 对象数组,然后在新的托管对象模型上调用 setEntities:。然后,最后,您将该模型与您的内置模型合并。

但请注意,一旦模型用于创建托管对象上下文(或用于存储),您就无法更改模型。模型更改后,您需要创建新的存储和上下文。

【讨论】:

以上是关于如何在 Objective-C 中动态创建实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Objective-C中动态分配指向对象的指针数组?

如何在 Symfony 中动态创建实体类

IOS/objective-c/core-data:如何从相关实体获取属性

如何在 Core Data 模型中动态创建新实体(表)?

如何制作动态显示图表,让图表随数据动起来

使用自动布局约束动态创建视图?在Objective-C中?