简单的说,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]。php
就像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实体的过程,而不需关心例如数据的显示、合法性检查、存储等其它部分,提升了开发效率。iphone
Core Data is organized into a large hierarchy of classes, though interaction is only prevalent with a small set of them. Core Data由相对庞大的类继承体系组成,但开发者须要关注的接口只是其中的一个相对小的子集。ide
类名 | 用途 | 关键方法 |
---|---|---|
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]。ui
Core Data是标准化的,能够自由的读写Xcode数据模型文件(一般是.xcdatamodel文件)。与EOF不一样,Core Data目前没有设计多用户或多线程访问模式。模型迁移一般也须要代码,若其它开发者依赖于某个数据模型,则该数据模型的设计者可能在模型发生改变时须要 与新数据模型一块儿提供版本转换代码。lua
Core Data的很大一部分设计都归功于早期的NeXT产品,Enterprise Objects Framework(EOF)[7]。spa