除了所有的“xxxID”属性,例如
caveID,看起来不错。您还需要遵循命名约定。
在两个或多个实体中具有相同的属性名称和(可能)相同的值是必要的SQL连接,但在Core Data中,这由对象和关系处理。
Core Data中的每个对象都自动具有全局唯一性。这意味着当您从一个对象创建到另一个对象的关系时,该关系具体标识一个特定的唯一对象。
这意味着您只需要在实际实体中添加像
caveID这样的属性,
caveID指定的实体在这种情况下是(可能)
Caves实体。您不需要在
CavesConditions实体或任何其他具有与“Caves”实体相关联的关系的实体中使用该属性。
(如果
xxxID
只是SQL的工件,则实际上除非应用程序交互的某些外部数据库需要它们,否则在Core Data中不需要它们。)
使用的一个好方法是任何特定值只应在关系的一侧显示,并且最好在整个数据模型中仅出现一次。
命名约定与SQL略有不同。Core Data实体不是表。实体更类似于类。每个实体应描述受管理对象的单个实例。这些实例中有多少最终出现在对象图中是无关紧要的。因此,实体名称是单数。
在这种情况下,
Caves应为
Cave,
Countries应为
Country,依此类推。
关系以其目标实体命名。它不是立即明显的,但是可视数据模型编辑器上的每个互补关系(默认)实际上都是两个关系,因为每一侧都有一个关系描述。每一侧都具有目标实体的名称。按照惯例,to-one关系具有单数名称,而to-many关系具有复数名称。
Caves.relConditions<-->>CaveConditons.getCave
...将变成
Cave.conditons<-->>CaveConditon.cave
命名规范非常重要,因为Objective-C使用约定的名称来生成和搜索访问器方法。
Flow.flows
指向CaveCondition
,因此关系应该被命名为类似于Flow.conditions
的东西。这使得在代码中容易理解关系的目标。Flow.flows
暗示着关系的目标是另一个流对象。然而从另一侧来看,CaveCondition.flow
是完全有意义的。 - TechZen