1

CoreData整理(一)——基本概念与简单使用


前言

    写这篇文章的缘由是当初公司要求做技术分享,选择了这个框架。CoreData框架虽然是官方出品,但其各种概念和存在的细节问题使得学习成本较高,相比较libsqlite和FMDB而言也显得较为笨重。此外一般开发也都习惯了写sql语句。由于以上的原因,所以一般持久化方案较少使用CoreData。
    但是,由于Xcode内置和其良好的封装性,我们只需几步就可以很容易的建立起持久化方案,良好的优化也让我们可以完全不用顾忌与sqlite交互会存在问题,此外CoreData还有很多例如数据迁移等强大的功能。所以还是有必要去了解学习一下。

本篇文章分为4个章节:

  • (一)基本概念与简单使用
  • (二)多线程方案
  • (三)MagicalRecord的使用
  • (四)数据迁移和其他知识点

目录

  • 简介
  • 相关概念
  • 如何在项目中接入
  • 实现简单CRUD

简介

简介:
    Core Data是OS X 10.4 Tiger之后引入的一个持久化技术,通过与数据库进行交互,将模型的状态持久化到磁盘。
    使用了对象-关系映射(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各封装类的关系图如下:

clipboard.png

  • 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的封装性很好,与数据库相关的所有内容都对应有相应的模型或OC类,例如Entity、NSManagedObject类。

对于CoreData中的CRUD操作来说,MO很像巫毒娃娃一样,由于巫毒娃娃与人之间建立了某种联系,所以当我们用针扎巫毒娃娃时,与其绑定的人会觉得痛。同样的当我们修改MO对象时,数据库中与之对应的记录就会改变,而MOC就充当这种联系。

使用sqlite和CoreData进行增删改查的流程入下。
clipboard.png


如何在项目中接入

1. 项目创建时自动接入

新建项目时勾选“Use Core Data”即可

clipboard.png

需要关注的是:

在AppDelegate.h中,看到多了三个成员属性和两个方法。Xcode为我们自动生成并进行了初始化。

clipboard.png

iOS10之后变成了使用NSPersistentContainer类,可以看下NSPersistentContainer类的声明,其实它只是将MOM,PSC,MOC做了封装,为了方便初始化和使用。

clipboard.png

同时目录中也多出来一个与项目名称相同的.xcdatamodeld文件

clipboard.png

2. 手动接入

首先导入CoreData框架

为了方便,创建了一个CoreDataManager类

.h
clipboard.png
.m
clipboard.png
clipboard.png
clipboard.png
clipboard.png


实现简单CRUD

1. 增

clipboard.png

2. 删

clipboard.png

3. 改

clipboard.png

4. 查

clipboard.png
clipboard.png


后续

CoreData整理(二)——多线程方案
CoreData整理(三)——MagicalRecord的使用
CoreData整理(四)——数据迁移和其他问题
Demo地址


参考文章

Core Data Programming Guide
深入浅出MagicalRecord-01
CoreData教程


你可能感兴趣的

载入中...