我正在构建一个 iPad 应用程序,我需要用户在其中动态创建实体。我已经有 3 个程序使用的实体。
你能帮我写代码怎么做吗?
我想根据我的理解来理解整个结构我必须创建新的 managedObjectModel,添加新的实体,而不是将它与现有的合并,对吗?
我正在构建一个 iPad 应用程序,我需要用户在其中动态创建实体。我已经有 3 个程序使用的实体。
你能帮我写代码怎么做吗?
我想根据我的理解来理解整个结构我必须创建新的 managedObjectModel,添加新的实体,而不是将它与现有的合并,对吗?
没错——您将创建一个 NSEntityDescription 对象数组,然后调用setEntities:
新的托管对象模型。然后,最后,您将该模型与您的内置模型合并。
但请注意,一旦模型用于创建托管对象上下文(或用于存储),您就无法更改模型。更改模型后,您需要创建新的存储和上下文。
虽然在实践中可以动态创建新实体和新模型,但这是非常复杂的。如果不出意外,您必须将任何现有的持久数据迁移到新模型和新的持久存储文件。我强烈建议不要尝试这样做,特别是如果您刚刚开始使用 Core Data。
你确实有选择:
首先,你确定你真的需要一个新实体吗?刚开始使用 Core Data 的人经常将实体误认为托管对象。实体之于托管对象,就像类之于实例一样。实体是用于创建对象图的抽象。它们实际上不包含数据。您需要新实体的时候非常非常罕见。
其次,如果您确实需要某种动态实体,通常最好将动态实体分解为许多固定的子实体,然后使用关系创建一个虚拟实体。例如,您需要一个动态的 Person“实体”,因此您在模型中创建了多个实体,每个实体都拥有该人的一个属性。你可以有一个Field
实体,它有一个fieldName
属性,然后是一个fieldValue
属性。然后有一个Person
没有属性但只是与必要Field
对象的关系的实际实体。您可以向任何人添加所需的任何字段,然后通过将关系移至其字段来重构虚拟人对象。
但是,我相当怀疑您是否需要这种灵活性。这种需求是非常罕见的。我会退后一步,看看您认为用户可能需要输入哪些动态数据。