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

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


前言

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

本篇文章分为4个章节:git

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

目录

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

简介

简介:
    Core Data是OS X 10.4 Tiger以后引入的一个持久化技术,经过与数据库进行交互,将模型的状态持久化到磁盘。
    使用了对象-关系映射(ORM)技术,很好的将数据中的表和字段转化为对象和属性,同时将表之间的关系转化成了对象之间的包含关系。
    咱们能够轻易的操做这些对象实现增删改查功能,而这些操做Core Data都已经帮咱们封装好了,它能够自动的将改变同步到数据库中。
    更易见的特色是它能够进行可视化操做,咱们能够经过可视化的界面很容易的的管理实体、属性及实体关系等。github

优势:sql

> 1. 封装性好。不须要写任何SQL语句,提供的api方法减小了模型层的代码的编写量。使用封装类NSPredicate和NSFetchRequest结合进行查询。
> 2. 优化性好。封装类内部有优化机制,性能较好。如懒加载、处理写入冲突等。
> 3. 可视化界面。Xcode提供可视化的界面,能够方便的去管理实体和关系。
> 4. 支持多线程。NSManagedObjectContext类有提供相关api,方便进行多线程操做。
> 5. 功能强大。提供迁移(migration)和撤销重作(undo/redo)等功能。

缺点:数据库

> 1. 学习成本高。框架较为笨重,概念多且较难理解。
> 2. 使用成本高。使用Core Data进行多线程操做须要作一些处理和优化。
> 3. 灵活性差。难以实现一些sql可以简单实现的操做。好比多表链接查询等。

相关概念

Core Data各封装类的关系图以下:segmentfault

clipboard.png

  • Entity 实体

咱们知道,通常使用数据库会建立各类表。好比用户表User、商品表Goods等等。而实体Entity就对应数据库中表的定义,实体、属性、关系对应数据库中的表、字段、关系。咱们能够在.xcdatamodeld文件的可视化界面中建立一些实体,并为其添加属性和关系。api

  • NSEntityDescription 实体描述对象

实体的封装类,包含了实体的名字、属性、关系等。安全

  • NSManagedObjectModel 托管对象模型 (MOM)

既然咱们要操做数据库,那么就须要知道数据库中全部的表和字段等,托管对象模型就保存了全部实体描述(NSEntityDescription)。它经过.mom或.momd文件(由.xcdatamodeld文件编译后获得)来进行实例化。多线程

  • NSManagedObject 托管对象 (MO)

托管对象对应数据库中某条记录,CoreData为每个MO设置了惟一的ID,以确保托管对象与数据库记录一一对应。咱们使用CoreData进行增删改查就是须要在托管对象上进行操做。app

  • 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教程

相关文章
相关标签/搜索