CoreData在数据模型编辑器中创建一些实体(Entity),然后在代码中为这些实体创建托管对象(Managed Object)。
术语“实体”和“托管对象”可能有点令人混淆,因为两者都表示数据模型对象。术语“实体”表示对象的描述,而“托管对象”用于表示在运行时创建的该实体的具体实例。因此,在数据模型编辑器中,你将创建实体;而在代码中,你将创建并检索托管对象。实体和托管对象之间的差异类似于类与类实例之间的差异。
实体由属性(property)组成。属性分为4种类型:特性(attribute)、关系、提取属性和提取请求。
特性在内核数据实体中的作用与实例变量在object-C类中的作用完全相同。它们都用于保存数据。
关系用于定义实体之间的关系。举例来说,假设你希望定义一个Person实体。你可能首先会定义一些特性,比如说hairColor、eyeColor、height和weight。你可以定义地址特性,比如说省份和邮政编码。或者,可以将它们嵌入到单独的HomeAddress实体中。使用后面这种方法,你可能还希望在Person和HomeAddress之间创建一个关系。
关系可以一对一或一对多。从Person到HomeAddress的关系可以是“一对一”,因为大多数人都只有一个家庭地址。从HomeAddress到Person的关系可以是“一对多”,因为可以多个Person住在相同的HomeAddress。
提取属性是关系的备选方法。它们之间的主要差异就是对加载的影响不同。举例来说,如果某个Person与HomeAddress之间有关系,则当Person加载时,HomeAddress也会随之加载。或者,如果某个Person使用提取属性来引用HomeAddress,则当Person加载时,HomeAddress不会随之加载,至少在访问HomeAddress之前不会加载它。可以将起称为“松散加载”。
提取请求时一个预定义的查询。举例来说,你可以说“我需要eyeColor为蓝色的所有Person”。
通常,特性、关系和提取属性都是使用Xcode的数据模型编辑器定义的。可以方便地在数据模型或在代码中定义提取请求。