iOS 数据持久化之CoreData(一)堆栈与基本概念

原创Blog,转载请注明出处
blog.csdn.net/hello_hwc
我的iOS SDK详解专栏,这里你能找到很多iOS 开发入门的文章。
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html

前言:CoreData是对象图管理数据持久化的一个良好的工具,是iOS开发必须掌握的技术之一。本文会先介绍一些概念,方便以后对于CoreData的讲解
CoreData的讲解计划:

  • 一篇讲解一些基本概念(本文)
  • 一篇讲解如何创建堆栈,如何进行基本的四种操作
  • 一篇详细讲解Managed Context以及Managed Object
  • 一篇讲解NSFetchResultController和UIDocument以及复杂的对象图
  • 一篇讲解CoreData性能方面的东西
  • 一篇讲解如何不用CoreData做数据存储(近期不一定会写)

对象图

在面向对象开发的语言中,对象图就是一组对象的关系。这些对象要么有直接的引用,要么有间接的饮用关系。例如:两个对象,照片和拍照者,通常照片会保存一个拍照着的指针,拍照着会保存一组拍照的照片指针。这就是一个简单的对象图。

归档(Archiving)

归档是把一组对象转变成能够存储或者在应用之间转移的文档过程。归档的主要价值就是把对象和对象的关系持久化存储为一个文件。Unarchiving就是Archiving的逆向过程。能够归档的对象要遵循NSCoding协议。

CoreData的特点

  1. 支持对象改变过程管理,支持撤销和重做
  2. 关系维护(例如删除一张照片的同时,会在拍照者中删除对应的指针)
  3. 惰性加载,部分加载来降低内存(在需要使用数据的时候再加载)
  4. 属性值检查(例如:保证年龄在0-200岁),保证数据有意义
  5. Schema迁移。Schema用来描述对象的(例如:name,age,sex描述一个人)。CoreData能够适应Schema的改变
  6. NSFetchedResultsController来更好支持Tableview
  7. 完整的支持KVC/KVO
  8. 支持复杂的数据查询
  9. 支持Merge policies(例如两个线程对同一个数据改变的情况)

CoreData的架构-堆栈

完整架构
iOS 数据持久化之CoreData(一)堆栈与基本概念_第1张图片

大部分情况下的架构
iOS 数据持久化之CoreData(一)堆栈与基本概念_第2张图片
其中

  • NSManagedObjectContext可以理解为是一个容器,从持久化存储(文件)中查询的数据在这个容器中形成对象图,对这些对象图中的对象操作都会存储在这个容器里,直到发出指令让容器中的内容同步到磁盘。

  • NSManagedObject 就是NSManagedObjectContext对象图中的实际对象。由NSManagedObjectContext管理。NSManagedObjectContext会存储这些对象的变化来支持重做和撤销。

  • NSPersistent Store 负责把对象图中的信息map到实际的存储信息

  • SQLite 和FileSystem就是保存到持久化存储的文件,CoreData支持SQLite的数据格式。但是注意,coreData不是DBMS,并不能管理SQLite

    其中,对NSManagedObject和NSManagedObjectContext的使用是核心

UIManagedDocument

上文的架构中提到了CoreData的堆栈建立,虽然看起来挺难,大多数不过使用的时候就知道其实很简单。iOS SDK也提供了一种简单的方式来创建堆栈,那就是UIManagedDocument。
在创建UIManagedDocument的实例的时候,会自动创建相关的堆栈,也可以重写一些方法来修改持久化存储协调器等堆栈组件。后边的几篇文章里我会降到。这里知道有这么个东西而且这个东西用起来很方便就好。

Managed Object Models

用来描述Managed Object的Schema,就是Object包括哪些属性以及各Object之间的关系。
包括几部分

  • Entities(实体)。实体有一个NSEntityDescription,它用来描述整个模型。NSEntityDescription可能包括NSAttributeDescription(属性描述)和NSRelationshipDescription(关系描述)。
  • 实体之间可以继承。这一点和类很相似,使用起来也差不多。
  • 抽象实体。是一个不会被实力化的实体,仅仅用作继承的父实体。
  • 属性。CoreData支持很多属性,string,number,date。也支持自定义属性。
  • Transient properties 不会持久化存储的属性
  • 关系。CoreData支持一对一和一对多的关系。

在XCode中,绝大部分使用使用图形化界面Core Data Model Editor来创建Managed Object Models。当然,也可以使用Code来创建,不过那是特殊情况了。Core Data Model Editor如图

查询的代价

一次查询分为三种情况

  • 对象在managed context中,这时代价极小,就是内存操作
  • 对象最近被取出过,在持久化存储协调器的缓存中,这样的代价也很小。
  • 对象需要从文件中取出,这时候代价就很大了。

小结:

CoreData看起来很麻烦,那是因为CoreData暴露了很多的接口,让你去灵活的使用。大多数情况下,使用起来其实很简单。下一篇文章,你会看到一个例子,如何简单的使用CoreData来进行对象图管理和持久化。

你可能感兴趣的:(ios,架构,堆栈,基本概念,coredata)