`
dcj3sjt126com
  • 浏览: 1818767 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Core Data浅谈系列之一 : 基础结构

    博客分类:
  • IOS
阅读更多

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,如下图: 
 
 
将这份Data Model命名为cdNBA,与工程同名,这份数据模型在后面会以NSManagedObjectModel实例的形式存在于内存中。然后再新建Player和Team两种实体,如下图:
 
 
从上图可以看出,一份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文件格式等。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics