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

简介:
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文件格式等。

Brief Talk About Core Data Series, Part 1 : Basic Structure 

Jason Lee @ Hangzhou
目录
相关文章
|
7月前
关于 sap.ui.base.Object 的简要介绍
关于 sap.ui.base.Object 的简要介绍
23 0
|
存储 数据采集 架构师
谈谈数据项目中的Data mapping(数据映射)
企业数据正变得越来越分散和庞大。与此同时,对企业来说,利用数据并将其转化为可操作的见解,变得比以往任何时候都更加重要。
谈谈数据项目中的Data mapping(数据映射)
SAP UI5的source code map(源代码映射)机制
SAP UI5库文件里出现的变量和函数,按照先后顺序出现在sap-ui-core-js.map文件里,如下图所示:
SAP UI5的source code map(源代码映射)机制
|
XML JSON API
一起谈.NET技术,Dojo Data Store——统一数据访问接口
  无论在传统的桌面应用还是在主流的互联网应用中,数据始终占据着软件应用中的核心地位。当下,web2.0已经是一个让人们耳熟能详的词汇,而由此带来的数据的开放与共享,引领我们走入了海量数据时代。在今天的互联网上,数据的交互几乎成为了我们的终极诉求,可随之而来的数据多样性,信息的分布式存储及松耦合,以及数据量的几何级规模的膨胀也带来了数据组织上的难度的增大,与此同时,伴随着Ajax, RIA及面向服务的网络应用的发展,其所要求的客户端数据处理逻辑的复杂性不断增加,使得开发难度不断加大。
1136 0
|
XML JSON API
Dojo Data Stor“.NET研究”e——统一数据访问接口
  无论在传统的桌面应用还是在主流的互联网应用中,数据始终占据着软件应用中的核心地位。当下,web2.0已经是一个让人们耳熟能详的词汇,而由此带来的数据的开放与共享,引领我们走入了海量数据时代。在今天的互联网上,数据的交互几乎成为了我们的终极诉求,可随之而来的数据多样性,信息的分布式存储及松耦合,以及数据量的几何级规模的膨胀也带来了数据组织上的难度的增大,与此同时,伴随着Ajax, RIA及面向服务的网络应用的发展,其所要求的客户端数据处理逻辑的复杂性不断增加,使得开发难度不断加大。
1074 0