​Core Data​​​是​​苹果官方​​​提供的一套​​框架​​​,用来解决与​​对象生命周期​​​管理、​​对象关系图​​​管理和​​持久化​​等方面相关的问题。大多数情况下,我们引入Core Data作为持久化数据的解决方案,并利用它将持久化数据映射为内存对象。



​为什么要使用Core Data​​呢?以下几点可供参考:



  • 有丰富且良好的文档,方便新手入门、老手埋坑。这些文档多半来源于​​Apple官方​​​,以及​​Stackoverflow​​。
  • 有着经过很多开发者检验的代码,除了省去我们编码的精力,还有着比我们自己编码更好的代码质量。
  • 苹果出品使得它与OS X或iOS开发工具链密切结合,我们可以在Xcode上进行表的设计,或者在Instruments上进行性能检测,并且在编码过程中能够很自然地维持着Cocoa开发风格。
  • 本身所具有的特性,比如支持多类型外部存储、撤销/重做、KVC、复杂查询和对象映射、自动验证、并发/合并策略、数据迁移、内存策略。除此之外,还与UI展现良好结合。



需要说明的是,Core Data并不是一款关系 ​​数据库​​,它拥有但不限于关系数据库的功能,比如它还具有模型设计器、数据访问层的功能。



 



针对上面提到的Core Data所具有的功能,来了解一下它的基本结构。



当我们使用Core Data作为持久化解决方案时,自上而下可以分为如下几层(称为 ​​Core Data Stack​​):



 



Managed Object Context



                    |



Persistent Store Coordinator  ——  Managed Object Model



                    |



Persistent Object Store



 



在将用户数据存储到外部文件前,我们需要考虑以什么样的格式进行存储,所以需要先进行 ​​数据表的设计​​​ —— 设计好的数据模型会以Managed Object Model的形式存在于内存中。采用面向对象的思想进行表的设计时,每一张表描述着一种实体(NSEntityDescription),一份 ​​​NSManagedObjectModel​​则包含着多种NSEntityDescription。



比如,我们可以创建一份新的工程,叫cdNBA,用来记录NBA球员信息。在实际工作之前,我们需要先设计数据模型。新建一份Data Model,如下图: 



 




Core Data浅谈系列之一 : 基础结构_存储文件


 


将这份Data Model命名为cdNBA,与工程同名,这份数据模型在后面会以NSManagedObjectModel实例的形式存在于内存中。然后再新建Player和Team两种实体,如下图:


 



Core Data浅谈系列之一 : 基础结构_持久化_02


 


从上图可以看出,一份NSManagedObjectModel,如cdNBA.xcdatamodel,可以包含多份NSEntityDescription,如Player、Team,而每一份NSEntityDescription有三种属性,分别是Attributes、Relationships和Fetched Properties。


 


完成了逻辑上的设计之后,我们可以根据NSEntityDescription在内存中创建对象,或者将相应的内存数据存储到外部文件中(严格地讲,这里不一定是外部存储文件)。


根据NSEntityDescription创建出来的对象比较特殊,我们称之为 ​​NSManagedObject​​​。由于它的特殊性,当我们要创建一个NSManagedObject对象时,比如Player实例,我们需要为其提供一个生存环境,称之为 ​​NSManagedObjectContext​​​。采用 ​​龙书​​的译法,我将其称为NSManagedObject的上下文。我个人觉得这种说法挺合适的,因为NSManagedObjectContext记录着存在于其中的NSManagedObject的生命周期、变化状态等。


一份NSManagedObjectContext实例作为NSManagedObject在内存中的缓存地带,我们可以从外部存储文件中读取或者临时创建一批NSManagedObject对象到其中,然后在context中做CURD操作。不论是从本地读取数据,或者是将数据存储到本地文件中,都需要经过context的把关。


 


当我们要将内存中的数据根据NSManagedObjectModel进行持久化时,我们需要一个新的角色来做中间层: ​​NSPersistentStoreCoordinator​​类。它位于context和存储文件之间,与NSManagedObjectModel结合,来为context服务,负责将context中的对象信息存储下来,或者将存储文件中的数据读取到context中。


 


最后就是存储文件 ​​NSPersistentStore​​了,可以是SQLite、二进制或者XML文件格式等。