CoreData整理(一)——基本概念与简单使用
前言
写这篇文章的缘由是当初公司要求做技术分享,选择了这个框架。CoreData框架虽然是官方出品,但其各种概念和存在的细节问题使得学习成本较高,相比较libsqlite和FMDB而言也显得较为笨重。此外一般开发也都习惯了写sql语句。由于以上的原因,所以一般持久化方案较少使用CoreData。
但是,由于Xcode内置和其良好的封装性,我们只需几步就可以很容易的建立起持久化方案,良好的优化也让我们可以完全不用顾忌与sqlite交互会存在问题,此外CoreData还有很多例如数据迁移等强大的功能。所以还是有必要去了解学习一下。
本篇文章分为4个章节:
- (一)基本概念与简单使用
- (二)多线程方案
- (三)MagicalRecord的使用
- (四)数据迁移和其他知识点
目录
- 简介
- 相关概念
- 如何在项目中接入
- 实现简单CRUD
简介
简介:
Core Data是OS X 10.4 Tiger之后引入的一个持久化技术,通过与数据库进行交互,将模型的状态持久化到磁盘。(官方文档:Core Data)
使用了对象-关系映射(ORM)技术,很好的将数据中的表和字段转化为对象和属性,同时将表之间的关系转化成了对象之间的包含关系。
我们可以轻易的操作这些对象实现增删改查功能,而这些操作Core Data都已经帮我们封装好了,它可以自动的将改变同步到数据库中。
更易见的特点是它可以进行可视化操作,我们可以通过可视化的界面很容易的的管理实体、属性及实体关系等。
优点:
> 1. 封装性好。不需要写任何SQL语句,提供的api方法减少了模型层的代码的编写量。使用封装类NSPredicate和NSFetchRequest结合进行查询。
> 2. 优化性好。封装类内部有优化机制,性能较好。如懒加载、处理写入冲突等。
> 3. 可视化界面。Xcode提供可视化的界面,可以方便的去管理实体和关系。
> 4. 支持多线程。NSManagedObjectContext类有提供相关api,方便进行多线程操作。
> 5. 功能强大。提供迁移(migration)和撤销重做(undo/redo)等功能。
缺点:
> 1. 学习成本高。框架较为笨重,概念多且较难理解。
> 2. 使用成本高。使用Core Data进行多线程操作需要做一些处理和优化。
> 3. 灵活性差。难以实现一些sql能够简单实现的操作。比如多表连接查询等。
相关概念
Core Data各封装类的关系图如下:
- Entity 实体
我们知道,一般使用数据库会创建各种表。比如用户表User、商品表Goods等等。而实体Entity就对应数据库中表的定义,实体、属性、关系对应数据库中的表、字段、关系。我们可以在.xcdatamodeld文件的可视化界面中创建一些实体,并为其添加属性和关系。
- NSEntityDescription 实体描述对象
实体的封装类,包含了实体的名字、属性、关系等。
- NSManagedObjectModel 托管对象模型 (MOM)
既然我们要操作数据库,那么就需要知道数据库中所有的表和字段等,托管对象模型就保存了所有实体描述(NSEntityDescription)。它通过.mom或.momd文件(由.xcdatamodeld文件编译后得到)来进行实例化。
- NSManagedObject 托管对象 (MO)
托管对象对应数据库中某条记录,CoreData为每一个MO设置了唯一的ID,以确保托管对象与数据库记录一一对应。我们使用CoreData进行增删改查就是需要在托管对象上进行操作。
- NSManagedObjectContext 托管对象上下文 (MOC)
那么我们对托管对象的操作是如何同步到数据库的呢?这就需要使用到托管对象上下文,MOC负责提交MO的改动。
- NSPersistentStoreCoordinator 持久化存储协调器 (PSC)
MOC会将改动提交至PSC,由PSC负责对sqlite数据库进行读写。CoreData在该层封装上进行了优化,使得PSC对数据库的操作是线程安全的,所以我们可以对PSC放心,无需关心它是如何操作数据库。
总体来说,CoreData的封装性很好,将数据库中的表模型化,将使用sql语句操作转变为对模型CRUD的提交操作。
使用sqlite和CoreData进行增删改查的流程入下。
如何在项目中接入
1. 项目创建时自动接入
新建项目时勾选“Use Core Data”即可
需要关注的是:
在AppDelegate.h中,看到多了三个成员属性和两个方法。Xcode为我们自动生成并进行了初始化。
iOS10之后变成了使用NSPersistentContainer类,可以看下NSPersistentContainer类的声明,其实它只是将MOM,PSC,MOC做了封装,为了方便初始化和使用。
同时目录中也多出来一个与项目名称相同的.xcdatamodeld文件
2. 手动接入
首先导入CoreData框架
为了方便,创建了一个CoreDataManager类
.h
.m
实现简单CRUD
1. 增
2. 删
3. 改
4. 查
后续
CoreData整理(二)——多线程方案
CoreData整理(三)——MagicalRecord的使用
CoreData整理(四)——数据迁移和其他问题
Demo地址
参考文章
Core Data Programming Guide
深入浅出MagicalRecord-01
CoreData教程
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。