Core Data介绍

来源:互联网 发布:易语言驱动保护源码 编辑:程序博客网 时间:2024/05/16 07:02

Core Data的使用

1、Core Data 功能初窥

对于处理诸如对象的生命周期管理,对象图管理等日常任务,Core Data框架提供了广泛其自动化的解决方案,有以下特性

(对象图-Object graph的解释:在面向对象的编程中,对象之间有各种关系,例如对象直接引用另外的对象,或者通过引用链间接的引用其他对象,这些关系组成了网状的结构。我们把这些对象(和他们之间的关系)称为对象图。对象图可大可小,有繁有简,只包含单个字符串对象的数组就是一个简答的代表,而包含了application对象,引用windows,menus和相关视图对象,其他对象这样的结构就是复杂的对象图的例子,如mainwindous.xib)

有时,你可能想要把这样的对象图转化形式,让他们可以被保存到文件中,以使其他的进程或其他的机器可以再次将内存中的内容读出,重构对象。这样的过程被称为为“归档”(Archiving)。

有些对象图使不完整的——通常称之为局部对象图。局部对象图包含了“占位fu”对象,所谓“占位fu”就是一些暂时无内容的对象,它们在后期被具体化。一个典型的例子就是nib文件中包含的File’s Owner对象。

1)对于key-value-coding和可以-value-observing完整且自动化的支持

除了为属性整合KVC和KVO的访问方法外,Core Data还整合了适当的集合访问方法来处理多只关系。

2)自动验证属性(property)值

Core Data中的managed object扩展了标准的KVC验证方法,以保证单个的数值在可接受的范围之内,从而使组合的值有意义

3)支持跟踪修改和撤销操作

对于撤销和重做的功能,除过基本的文本编辑外,Core Data还提供了内置d管理方式。

4)关系的维护

Core Data管理数据的变化传播,包括维护对象间关系的一致性

5)在内存和界面上分组,过滤,组织数据

6)自动支持对象存储子啊外部仓库的功能

7)创建复杂请求

你不需要动手去写复杂的SQL语句,就可以创建复杂的数据请求。方法是在“获取请求”(fetch request)中关联NSPredicate。NSPredicate支持基本的功能,相关子查询和其他高级的SQL特性,它还支持正确的Unicode编码,区域感知查询,排序,和正则表达式。

8)延迟操作

Core Data使用延迟加载(lazy loading)的方式减少内存的负载。它还支持部分实体化延迟加载,和“写时拷贝”的数据共享的机制(写时拷贝,说的是在复制对象的时候,它实际上不生成新的空间,而是让对象共享一块存储区域,在其内容发生改变的时候再分配)。

9)合并的策略

Core Data内置了版本跟踪和乐观锁(optimistic locking)来支持多用户的写入冲突的解决。乐观锁:假定数据一般不出现冲突,所以再数据提交更新的时候,才对数据的冲突进行检测,如果冲突了,就返回冲突信息。

10)  数据迁移

就开发工作和运行时资源来说,处理数据库架构的改变总是很复杂的,Core Data的schema migration工具可以简单的应对数据库结构变化的任务,而且再某些情况下,允许你执行高效的数据库原地迁移工作。

11)  可选择针对程序Controller层的集成,来支持UI的显示同步

Core Data再iPhone OS之上提供了NSFetchedResultsController对象来做相关d的工作,再Mac OS X上,我们用Cocoa提供的绑定(Binding)机制来完成。

2、为何要使用Core Data

使用Core Data有很多的原因,其中最简单的一条就是:它能让你为Model层写的代码的行数减少为原来的50%到70%。着归功与之前提到的Core Data的特性,更妙的是,对于上述特性你也既不用去测试,也不用花功夫其优化。

Core Data用于成熟的代码,这些代码通过单元测试来保证品质。应用Core Data的程序每天被世界上几百万的用户使用,通过及格版本的发布,以被高度优化,它能利用Model层的信息和运行时的特性,而不通过程序层的代码实现。除了提供强大的安全支持和错误处理外,它还提供了最优的内存扩展性,可实现有竞争力的解决方案。

3、Core Data的误区

1)Core Data不是一个关系型数据库,也不是关系型数据库管理系统。

Core Data为数据变更管理,对象存储,对象读取恢复的功能提供了支持。它可以使用SQLite作为持久化存储的类型

二、Core Data基础

1. Core Data基本结构

再大部分的程序中,你可能要通过某些方式打开一个包含对象归档的文件,这个文件内至少要有一个根对象的引用。另外,还可以将所有的对象归档到文件中,如果你想要实现撤销的功能,就要纪录对象的更改情况。

使用Core Data的框架,大多数功能都可以自动实现,因为我们有managed object context。Managed objectcontext就像是一个关卡,通过它可以访问框架底层的对象,这些对象的集合我们称之为persistencestack(数据持久栈)。Managed object context作为程序中对象和外部数据存储的中转站。栈的底部是persistence object stores(持久化数据存储)

 

被管理对象和上下文(managed object context)

你可以把被管理的对象上下文想象成一个“聪明”的便笺薄。当你从数据持久层获得对象时,就把这些临时的数据拷贝到自己的便笺薄上(再便笺薄上对象会恢复以前的对象图结构)。然后你就可以随心所欲的修改这些值了。

附再Core Data框架中模型对象(model objects)常被称为“被管理对象(managed objects)”。所有的被管理对象都要通过上下文进行注册,使用上下文,你可以再对象图中添加、删除对象,并纪录对象的更改。纪录更改后就能支持撤销和重做的功能。同时,上下文还能保证关系更改后对象图的完整性。

如果你想保存所作的修改,上下文会保证对象的有效性。爱验证有效性后被写入到persistent store中,你再程序中的添加和删除都会被作用再存储的数据中。

再你的一个程序中,可能存在多个上下文。对于数据存储中的每个对象,对应的都有唯一的一个被管理对象(managed object)和上下文关联。欢歌角度来想,再persistent store中存储的对象有可能被用在不同的上下文中,每个上下文都有与之对应的被管理对象,被管理对象可以被独立的修改,这样就可能再存储时导致数据的不一致。

 

获取数据的请求(Fetch Request)

 

要使用上下文来获取数据,你需要创建相应的请求。Fetchrequest对象包含你想获取的对象的描述。Fetch request包含三个部分。使用最简单的写法:必须指定实体的名称,这就暗示了,每次只能获得一种类型的实体。Fetch request还可以包含谓词(predicate)。谓词将描述对象需要满足的条件。另外Fetch request还可包含一个用于描述排序方式的对象。

再程序中,你将Fetch Request这个请求发送给上下文,上下午就会从相关的数据源中查找符合条件的对象(也可能找不到),并返回。所有的被管理对象都必须再上下文中注册,因此通过fetch request获得的对象自动被注册。当如前所述,每个再持久存储层中的对象对应一个和上下文相关的被管理的对象,因此,如果再上下文中已经存在了fetch request要获取的对象,那么这个对象将被返回。

Core Data追求高执行效率。它是需求驱动的,因此只会创建你确实需要的对象。对象图不需要保留所有再数据存储层中的对象。单纯指定数据持久层的动作不会将其中所有的数据放到上下文中,当你想从数据存储层中获取某些对象的时候,你只会得到那些你请求的。如果你不再需要这个对象的时候,默认情况下它会被释放

 

持久化存储助理(Persistent StoreCoordinate)

 

之前提到过,程序中的对象和外部存储的数据通过Core Data框架中的一系列对象进行协调,着一系列的对象总的被称为持久化栈。再栈顶是被管理对象shangxia文,而栈底是持久化对象存储层,而他们之间就是持久化存储助理。

事实上,持久化存储助理定义了一个栈。从设计方面考虑,它就是可以作为上下文的“外观”,这样多个数据存储看起来就像一个。然后上下文就可以根据这些数据存储来创建对象图了。持久化存储助理只能关联到一个被管理的对象模型。如果你想要把不同的实体放到不同的存储中其,就需要为你的模型实体做“分区”,方式是通过定义被管理对象模型的configuration。

 

持久化存储(Persistent Stores)

 

持久化存储是和单独的一个文件或外部的数据关联的,它负责将数据和上下文进行对应。通常,需要你直接和持久化对象存储打交道的地方,就是指定新的、和程序进行关联的外部数据d位置。大多数需要访问持久化的动作都有上下文完成。

程序代码——特别是和被管理对象相关的部分——不应该对持久化存储做任何假设(也就是不需要自己考虑存储的方式和过程)。Core Data对几种文件格式有原生的支持,你可以选择一种自己程序需要的,假设再某个阶段你决定换一种文件的格式。而不想修改程序的框架,而且,你的程序做了适当的抽象。再最初的设计中,程序只从本地文件中获取数据,而你的程序没有区硬指定对应数据的获取位置,而是可以从后期指定从远程位置添加新的数据类型,这样你就可以使用新的类型,而不需要修改代码。

 

持久化文档(Persistent Document)

你可以通过代码的方式创建和配置持久存储栈,但在大多数情况下,你只想创建一个基于文档的应用程序来读写文件。这是,用NSDocument的子类NSPersistent可以让你感受到用Core Data的便利。默认情况下,NSPersistentDocument就已经创建了它自己的持久存储栈,其中包含了上下文,和单个的持久对象存储,来处理这样文档和外部数据“一对一”的隐射关系。

 

被管理对象模型(managed object models)

多数的Core Data的功能依赖于你创建的,用来描述的实体及其属性,关系的模型图

被管理对象模型是NSManagedObjectModel的实例。它描述了你在程序中使用的实体的概要信息。

实体(Entities)

模型包含了NSEntityDescription对象,NSEntityDescription对象指代了模型的实体。关于实体由两个重要特征:名称和类名。

NSEntityDescription对象可包含NSAttributeDescription对象和NSRelationshipDescription对象。实体也可能包含fetched属性,该属性由NSFetchedPropertyDescription指代,模型中由对应的fetch请求的模版,fetch请求由NSFetchRequest所指代。

实体的继承关系

实体的继承和类的继承很相似,当然,也同样有用,如果你由若干个相似的实体,就可以抽离他们的共有特性作为一个“父实体”,就省去了在多个实体中指定相同的属性。

如果你想在代码中,创建继承关系。就需要自顶向下来执行。不能直接指定实体的父实体,而只能给一个实体指定字实体(使用setSubntities)。就是说,如果你想给A实体指定父实体,就只能把A作为数组中的一个元素,调用父实体setSubntities来设置。

 

抽象实体

你可以把一个实体指定为“抽象实体”也就是说,你不打算使用这个实体创建实例。通常,当你想把这个实体作为父实体,而由字实体来实现详细内容的时候,就把它声明为抽象实体。例如,在一个绘图程序中,可能会设计一个Graphic实体,它包含了x和y坐标信息、颜色、绘制区域,而你不回去创建一个Graphic实例而是使用具体的子实体——Circle,TextArea,Line

原创粉丝点击