Core Data

Core Data是个框架,它使得开发者可以把数据当成对象来操作,而不必在乎数据在磁盘中的存储方式。对于iOS程序员来说,这很有用,因为他们已经可以通过代码非常熟练地操作对象。由Core Data所提供的数据对象叫做托管对象(managed object),而Core Data本身则位于应用程序和持久化存储区(persistent store)之间。持久化存储区在iOS中多数指的是SQLite数据库。

为了把数据从托管对象映射到持久化存储区中,Core Data需要使用托管对象模型,而开发者则可以通过对象图(object graph)来配置应用程序的数据结构。有了托管对象之后,就可以直接在OC或Swift里面操作它们,而无需再编写SQL代码了。当把数据保存到磁盘的时候,Core Data显然会把这些托管对象映射回持久化存储区里面。

托管对象持有一份对持久化存储区里相关数据的拷贝。如果用数据库作为持久化存储区,那么托管对象可能对应数据库里某张数据表中的一行。托管对象可以是NSManagedObject类的实例,但一般情况下,它都是某个NSManagedObject子类的实例。

所有托管对象都必须位于托管对象上下文(managed object context)里面,而托管对象上下文又位于高速的易失性存储器里面,也就是位于RAM中。为什么需要有托管对象上下文呢?原因之一就是在磁盘与RAM之间传输数据时会有开销。磁盘读写速度比RAM慢得多,所以不应该频繁访问它。而有了托管对象上下文之后,对于原来需要读取磁盘才能获取到的数据,现在只需要访问这个上下文,就可以非常迅速地获取了。但它的缺点在于,开发者必须在托管对象上下文上面定期调用save:方法,以将变更后的数据写回磁盘。托管对象上下文的另一个功能是记录开发者对托管对象所做的修改,以提供完整的撤销与重做支持。

下图直观地描述了Core Data的几个主要概念。

1 持久化存储协调器

持久化存储协调器里面包含一份持久化存储区,而存储区里面又含有数据表里的若干行数据。设置持久化存储协调器的时候,我们通常选用SQLite数据库作为持久化存储区。

与原子存储不同,SQLite数据库会在用户提交变更日志时进行增量更新,变更日志也叫做事务日志。由于采用了这种更新方式,所以SQLite数据库的内存占用量相对来说非常小。有鉴于此,开发者一般都会选用SQLite数据库,尤其在把Core Data集成到iCloud的时候,更应该如此。

同一个持久化存储协调器可以有多个持久化存储区。把CoreData与iCloud相集成的时候,就可能会出现这种情况。我们可以把不属于iCloud的数据放在一个存储区里,而把属于iCloud的数据放在另一个存储区里。这样既能节省网络带宽,又能节省iCloud存储空间。即便你有两个持久化存储区,也不意味着必须使用两种对象图。Core Data的模型配置允许开发者使用多个独立的存储区,但却采用同一套对象图。

要想创建持久化存储区,需生成NSPersistentStore类的实例;要想创建持久化存储协调器,需生成NSPersistentStoreCoordinator类的实例。

2 托管对象模型

托管对象模型,它位于持久化存储协调器和托管对象上下文之间。顾名思义,托管对象模型是描述数据结构的数据或图示,而托管对象正式以它为基础产生出来的。它与数据库模式相似,有时也叫做对象图。要想创建托管对象模型,可以用XCode来配置实体及实体之间的关系。实体就是数据库中的表,其属性的数据类型可以是整数、字符串或日期。

要想创建托管对象模型,需生成NSManagedObjectModel类的实例。

3 托管对象上下文

托管对象上下文,其中包含多个托管对象。托管对象上下文负责管理其中对象的生命周期,并且负责提供许多强大的功能,诸如faulting、变更追踪、验证等。faulting就是用户从持久化存储区中获取数据时,系统只会把需要用到的那一部分获取过来。变更追踪用户支持撤销及重做功能。验证机制用来确保由托管对象模型所订立的规则。

持久化存储区可以有很多个,与之类似,托管对象上下文也可以不止一个。有时我们需要在后台处理任务,这种情况下可以采用多个上下文。假如在前台上下文上面调用save,那么用户界面就可能会有“卡顿”现象尤其当数据变化较大的时候更是如此。要想避免这个问题,有个简单的办法就是只在用户按下Home键时才去调用save,这时应用程序会转入后台。还有稍微复杂但却更加灵活的办法,就是采用两个托管对象上下文。请记住,托管对象上下文是存放在高速内存里面的。你可以配置其中一个上下文,令其把数据保存到另一个上下文里。一旦把前台上下文中的数据保存到后台上下文,那么久可将后台上下文中的数据异步地存入磁盘。这种分段式的做法可以确保磁盘写入操作不会影响用户界面的流畅度。

要想创建托管对象上下文,需上传NSManagedObjectContext类的实例。

 


Appendix

Core Data Programming Guide

Revision History

时间描述
2016-10-21博文完成

CSDN:http://blog.csdn.net/y550918116j

GitHub:https://github.com/937447974

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值