您的位置:首页 > 移动开发

Core Data Basics(Apple官方文档的译文)

2014-09-29 22:06 204 查看
这篇文章将向您介绍CoreData的基础架构和如何使用CoreData。

CoreData基础框架

在大多数的应用程序中,你需要一个方法来把对象们保存在本地,以待备用。甚至你想支持undo和redo操作。举个栗子,在“员工"管理应用中,你需要一个方法来打开一个文件,它包含”员工“和”部门“对象。例如”员工“列表--如图一所示。你也需要一个方法能将他们全部保存到本地;

提示:本文使用员工的例子,是因为关系很清晰,容易被人理解。但这并不能说明CoreData框架仅局限于基于数据库的应用程序,也不一定是基于CS框架应用程序的最好选择。CoreData框架对矢量图应用如Sketch,或者对演示类应用如Keynote也一样有用。
虽然说cocoa框架提供了很完整的应用程序框架支持,但是为了让你的程序能支持各种复杂的本地化数据操作,你任然需要编写一些必要的代码。

图一,标准的cocoa文档结构



CoreData中大部分的功能会由一个名叫”managed
object context“(我们之后就叫他”Context“)的类提供,context只会在内存里存在,它不会被保存到本地,它的作用是和 持久化栈 交互,持久化栈,是一个存储本地数据的堆栈,它的栈底,就是persistent
object stores。
如图二所示。



coreData并不局限于文档式的应用程序,他适用于所有的应用程序。他也可以用纯代码实现。


Managed Objects 和 Contexts

你能把context想象为一个智能便笺本,当你从持久存储中获取对象时,将临时拷贝到便笺本。他们将形成一个对象图集合,以便你任意修改。事实上,除非你保存这些修改,不然,本地数据将不会被改变。
Model对象在CoreData框架编译过后会成为managed objects。所有的managed
objects都一定会在context中注册。你想要添加或者删除或者修改managed object,都必须通过context。

你也许会在同一个应用程序中使用不止一个Context,但每一个context只能对应一个persistent store.为什么?因为加入有多个context对应一个persistent
store的话,那么在save的时候会导致不一致(详情可见 “Using
Managed Objects”)

获取请求(Fetch
Requests

你可以创建一个FetchRequsts对象,来检索context中的数据。FetchRequsts对象中可以指定你需要的数据。比如,全部“雇员”,或者“在市场部中的雇员,以薪资从高到底排序。”一个FetchRequsts请求包含三部分,第一,必须指定实体(entity)的名称(就是说,你一次只能检索一个实体里面的数据)。第二,谓词(predicate相当于苹果自己的SQL语句),第三,排序方式。如图三所示



图三

当你发送一个FetchRequstscontext,它将返回你查询到的结果,因为context中会有所有的数据对象注册,所以他并不是去本地数据库中拿数据,而是直接在内存中获得。假如一次FetchRequsts请求是另一次FetchRequsts请求一样的结果,那么,将会直接返回那一次的FetchRequsts请求结果。

持久存储协调器(Persistent
Store Coordinator

如上所述,那些协调 应用程序中对象 本地存储数据 的对象就叫做持久化堆栈(persistence stack)。处在栈顶的就是Context,栈底就是持久化对象存储(persistent
object stores)。在它们两之间的部分就是持久存储协调器。

事实上持久存储协调器定义了一个堆栈。它将所有的context封装在一起。一个协调器只能关联一个model。加入你想将不同的实例放进不同的stores。你必须将你的model在配置里面分区。(详情见“Configurations”)

图4展示了一个“员工”和“部门”存储在一个文件里面,“客户”和“公司”存储在另一个文件里面的例子。当你检索对象的时候,他们从文件中自动获取,当你保存的时候,他们自动归档,一切都那么完美。



图四

持久库(Persistent Stores)

持久库是关联着文件或者数据库,并且负责将数据从本地数据中,映射到context中。通常,这些操作只发生在当你指定一个新的外部数据库的时候(比如,当用户打开或者保存本地文档的时候)。更多其他的操作是用过context完成。

你的代码,只需要负责managed object的逻辑,不要设想对持久库的数据作任何修改。CoreData提供了多种文件格式支持。你可以根据你应用程序的需求选择文件格式,并且在开发的不同阶段,使用不同的文件格式都不用改变程序的体系结构此外,假如你的程序有一定的抽象,当你以后写代码的时候就不需要做额外的功了。比如程序一开始只是本地持久化,但到某一阶段,能够不添加任何代码就支持远程数据持久化。

重要:尽管CoreData支持SQLite数据库,但它并不能直接调用CoreData的API,CoreData只是帮忙管理这个SQLite数据库而已。详情可见“Persistent
Stores Features”
文档持久化(Persistent Documents

你可以通过代码的方式创建和配置持久化堆栈.然而在更多的情况下,你只是想创建一个简单的基于文档的应用程序,包含读和写的功能。这个时候,NSPersistentDocument类能利用CoreData框架的优势,轻松的帮你实现。默认情况下,NSPersistentDocument对象会创建属于自己的持久栈,包括context和一个持久库。并且在文档和本地数据之间是一对一的映射。

NSPersistentDocument类,提供了访问context的方法,并且提供了标准的,在coredata环境下使用NSDucoment的读写方法。默认情况下,你不需要写任何代码来处理对象持久性。一个持久化文档的undo功能是被集成到context中的。

对象和对象模型(Managed Objects and the Managed Object Model)

为了管理对象图和支持对象持久化,CoreData需要一个对对象丰富的描述。对象模型,他提供了对 对象或者说是实例,关系的详情。如图五所示,你通常用Xcode的模型设计工具创建模型。(如果你愿意,你也可以用代码创建。)



图五,有两个实例的模型

原文档地址:
https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/CoreData/Articles/cdBasics.html#//apple_ref/doc/uid/TP40001650-TP1
提示:本文使用员工的例子,是因为关系很清晰,容易被人理解。但这并不能说明CoreData框架仅局限于基于数据库的应用程序,也不一定是基于CS框架应用程序的最好选择。CoreData框架对矢量图应用如Sketch,或者对演示类应用如Keynote也一样有用。
提示:本文使用员工的例子,是因为关系很清晰,容易被人理解。但这并不能说明CoreData框架仅局限于基于数据库的应用程序,也不一定是基于CS框架应用程序的最好选择。CoreData框架对矢量图应用如Sketch,或者对演示类应用如Keynote也一样有用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: