简单的说,Core Data就是可以存储到磁盘的对象图,[...]Core Data可以帮我们做很多任务作。它可以作为软件的整个模型层。它不仅仅在磁盘上存储数据,也把我们需要的数据对象读取到内存中。[1]——Marcus Zarra,Core Data
Core Data是Mac OS X中Cocoa API的一部分,首次在Mac OS X 10.4 Tiger与iOS 3.0系统中出现[2]。它允许按照实体-属性-值模型组织数据,并以XML,二进制文件或SQLite数据文件的格式将其串行化。Core Data允许用户使用代表实体和实体间关系的高层对象来操作数据。它也可以管理串行化的数据,提供对象生存期管理与object graph管理,包括存储。Core Data直接与SQLite交互,避免开发者使用原本的SQL语句[3]。
就像Cocoa绑定在模型-视图-控制器设计中做了很多控制器的工作一样,Core Data做了很多数据模型的工作。它的主要任务是负责数据更改的管理,串行化到磁盘,最小化内存占用,以及查询数据。
使用方法
Core Data使用包括实体和实体间关系,以及查找符合某些条件的实体的请求等内容的高层数据模型描述数据。开发者可以在纯对象层上查找与管理这些数据,二不必担心存储和查找的实现细节。Interface Builder中的控制器对象可以直接获取与管理实体,若与Cocoa绑定结合,则可以在不写自定义代码的情况下让用户界面显示、修改与管理数据模型中的大部分内容。
例如:开发者希望开发一个管理vCard的程序。作者希望使用Core Data将一些vCard读入对象中,然后把它们存入一个大XML文件中。开发者需要在Xcode中创建数据模型,然后到Interface Builder中加入Core Data Entity项以创建其数据模型对应的GUI。然后,开发者可以加入标准的Objective-C代码以读取vCard,并将数据写入由Core Data管理的实体中。在此,开发者的代码是管理Core Data对象,而非其对应的vCard。最后,将Save
菜单项连接到控制器对象对应的方法上,使得控制器在接到存储消息后自动的检查数据堆栈,确认数据是否合法,最后利用当前更改重写对应的Core Data文档。在整个过程中,开发者只需要专注于将vCard文件转换为Core Data实体的过程,而不需关心例如数据的显示、合法性检查、存储等其它部分,提高了开发效率。
Core Data is organized into a large hierarchy of classes, though interaction is only prevalent with a small set of them. Core Data由相对庞大的类继承体系组成,但开发者需要关注的接口只是其中的一个相对小的子集。
类名 | 用途 | 关键方法 |
---|---|---|
NSManagedObject |
|
|
NSManagedObjectContext |
|
|
NSManagedObjectModel |
|
|
NSFetchRequest |
|
|
NSPersistentStoreCoordinator |
|
|
NSPredicate |
|
|
存储格式
Core Data可以将数据存储为XML,二进制文件或SQLite文件[3]。在Mac OS X 10.5 Leopard及以后的版本中,开发者也可以通过继承NSPersistentStore类以创建自定义的存储格式。每种方法都有其优缺点,例如XML的可读性,SQLite的节约空间等。Core Data的这一方面类似于原始的Enterprise Objects Framework(EOF)系统,但EOF中开发者可以使用相对简洁的查询方式,而在Core Data中,只能使用一个语法类似SQL子集的查询语言,称为Predicate[6]。
Core Data是标准化的,可以自由的读写Xcode数据模型文件(通常是.xcdatamodel文件)。与EOF不同,Core Data目前没有设计多用户或多线程访问模式。模型迁移通常也需要代码,若其它开发者依赖于某个数据模型,则该数据模型的设计者可能在模型发生改变时需要 与新数据模型一起提供版本转换代码。
历史与发展
Core Data的很大一部分设计都归功于早期的NeXT产品,Enterprise Objects Framework(EOF)[7]。