上面已经说完了SQLite和FMDB以及两者的区别,本篇将讲述iOS中另一个存储方式,CoreData的使用。通读下来大约10分钟,后续还会根据项目中问题,不断更新。

一、预备知识

在了解CoreData,大家有必要了解对象关系映射(英语称object Relational Mapping,简称ORM)。

1.ORM

ORM是通过使用描述对象和数据库之间映射的元数据,可以实现将对象自动持久化到关系数据库当中。ORM的存在为了解决面向对象与数据库科恩干存在不匹配的一种技术。

二、初识CoreData

1.CoreData是一种在iOS 3系统中,也是苹果自己推出的数据存储框架,采用了一种ORM(对象关系映射)的存储关系。CoreData一个比较大的优势在于在使用CoreData过程中不需要我们编写SQL语句,也就是将OC对象存储于数据库,也可以将数据库数据转为OC对象(数据库数据与OC对象相互转换)。

2.CoreData几个类

(1)NSManagedObjectContext

意思是托管对象上下文,数据库的大多数操作是在这个类操作

(2)NSManagedObjectModel

意思是托管对象模型,其中一个托管对象模型关联到一个模型文件,里面存储着数据库的数据结构。

(3)NSPersistentStoreCoordinator

意思是持久化存储协调器,主要负责协调上下文玉存储的区域的关系。

(4)NSManagedObject

意思是托管对象类,其中CoreData里面的托管对象都会继承此类。

三、CoreData基本使用

下面开始讲解CoreData的基本使用,里面会插入图片和代码,可能内容比较多,希望大家静下来看完(比较考验大家的耐心程度)。

使用CoreData方式,有两种可能。第一种是项目开始就创建带有CoreData数据库,还有一种项目已经开始了,重新接入CoreData,下面我们第三部分主要讲述这两种方式的过程。

1.项目开始就使用CoreData

我们在创建项目的时候,勾选Use Core Data

如果利用项目刚建时,勾选Use Core Data,这样在目录中就会出现,后缀名为.xcdatamodeld。

打开AppDelegate发现类中多了以下内容

AppDelegate.h

AppDelegate.m中

我们可以点开testCoreData.xcdatamodeld文件,我们可以看到实体和关系。如下图

通过点击左色红色添加红色,右边红色添加属性,在这中间我们还需要留意一些细节。

(1)

创建后可以清楚的看到模型文件左侧的列表,有三个Entities、Fetch Requests以及Configurations三个选项,意思分别是:实体,请求模版以及配置信息。

(2)

添加完一个实体后,你会发现一个实体是对应着三个内容,分别是Attributes、Relationships和Fetched Properties,意思分别是:属性、关联关系以及获取操作。

(3)实体属性类型

我们来分别简单解释类型的意义,从上往下

Undefined:也就是默认值,如果参与编译会报错

Integer 16:代表整数,范围是-32768 ~ 32767

Integer 32:代表整数,范围是-2147483648 ~ 2147483647

Integer 64:代表整数,范围是–9223372036854775808 ~ 9223372036854775807,还是很大的,较少用

Double:代表小数

Float:代表小数

String:代表字符串,NSString表示

Boolean:代表布尔值,使用NSNumber表示

Date:代表日期时期

Binary Data:代表二进制,是用NSData表示

Transformable:代表Objective对象,要遵守NSCoding协议

(4)关联关系

点击加号,可以添加关联关系,在inverse这个属性代表两个实体在Relationships设置关联关系后之后,是否可以从一个实体中找到另一个实体,这样使两个实体具有双向的关联关系。

(5)Editor Style

大家通过点击下面红色按钮,style按钮可以看出实体和属性的关系,以及可以看出实体之间的对应的关系。

上面是coreData的视图的基本运用,自己也是一个不断摸索的过程,下面讲述CoreData的基本操作。

三、CoreData基本使用

在讲述操作之前,我们首先讲述NSManagedObjectContext,苹果推荐使用initWithConcurrencyType方式创建,在创建时,指定当前是什么类型的并发队列,参数也是一个枚举值。

NSManagedObjectContext枚举值参数有三个类型:

(1)NSConfinementConcurrencyType:此类型在iOS9之后被苹果弃用,所以不建议用这个API。

(2)NSPrivateQueueConcurrencyType:代表私有并发队列的类型,操作也是在子线程中完成的。

(3)NSMainQueueConcurrencyType:代表主并发队列类型,如果在操作过程中,需要涉及到UI操作,则应该使用这个参数初始化上下文完成操作。

下面我们一个company的模型文件-主队列并发类型的NSManagedObjectContext

// 创建上下文对象,并发队列设置为主队列
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; // 创建托管对象模型,并使用Company.momd路径当做初始化参数
NSURL *modelPath = [[NSBundle mainBundle] URLForResource:@"Company" withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelPath]; // 创建持久化存储调度器
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; // 创建并关联SQLite数据库文件,如果已经存在则不会重复创建
NSString *dataPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
dataPath = [dataPath stringByAppendingFormat:@"/%@.sqlite", @"Company"];
[coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:dataPath] options:nil error:nil]; // 上下文对象设置属性为持久化存储器
context.persistentStoreCoordinator = coordinator;

3.1 插入操作

CoreData通过NSEntityDescription的insert进行插入操作,这样就会生成并返回一个托管对象,并将这个对象插入到上下文中。下面以一个Employee为例:

// 开始创建托管对象,并指明好创建的托管对象所属实体名
Employee *emp = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:context];
emp.name = @"lxz";
emp.height = @1.7;
emp.brithday = [NSDate date]; // 通过这样上下文保存对象,并在保存前判断是否有了最新的更改
NSError *error = nil;
if (context.hasChanges) {
[context save:&error];
} // 错误处理
if (error) {
NSLog(@"CoreData Insert Data Error : %@", error);
}

NSManagedObjectContext将操作的数据放到了缓存层中,只有调用了NSManagedObjectContext的save后,才会对数据库进行真正的操作,否则对象仅仅存在内存中,这样就很好地避免了数据库的频繁访问。

3.2 删除操作

CoreData首先通过获取需要删除的托管对象,遍历所需要获取的对象数组,逐个删除,最后调用NSManagedObjectContext的save方法。

// 获取数据的请求对象,指明对实体进行删除操作,以Employee为例
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"]; // 通过创建谓词对象,然后过滤掉符合要求的对象,也就是要删除的对象
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", @"lxz"];
request.predicate = predicate; // 通过执行获取操作,找到要删除的对象即可
NSError *error = nil;
NSArray<Employee *> *employees = [context executeFetchRequest:request error:&error]; // 开始真正操作,一一遍历,遍历符合删除要求的对象数组,执行删除操作
[employees enumerateObjectsUsingBlock:^(Employee * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[context deleteObject:obj];
}]; // 最后保存数据,保存上下文。
if (context.hasChanges) {
[context save:nil];
} // 错误处理
if (error) {
NSLog(@"CoreData Delete Data Error : %@", error);
}

3.3 修改操作

具体的描述和上面差不多。

// 获取数据的请求对象,指明对实体进行修改操作,以Employee为例
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"]; // 创建谓词对象,设置过滤条件,找到要修改的对象
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", @"lxz"];
request.predicate = predicate; // 通过执行获取请求,获取到符合要求的托管对象,修改即可
NSError *error = nil;
NSArray<Employee *> *employees = [context executeFetchRequest:request error:&error];
[employees enumerateObjectsUsingBlock:^(Employee * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
obj.height = @.f;
}]; // 通过调用save将上面的修改进行存储
if (context.hasChanges) {
[context save:nil];
} // 错误处理
if (error) {
NSLog(@"CoreData Update Data Error : %@", error);
}

3.4 查找操作

查找操作是是有许多条件限制,根据条件查找出相应的数据,下面以一个例子说明一下(查找出所有的元素,条件以后细节会讲出)

//  获取数据的请求对象,指明对实体进行查询操作,以Employee为例
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"]; // 执行获取操作,获取所有Employee托管对象
NSError *error = nil;
NSArray<Employee *> *employees = [context executeFetchRequest:request error:&error];
[employees enumerateObjectsUsingBlock:^(Employee * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"Employee Name : %@, Height : %@, Brithday : %@", obj.name, obj.height, obj.brithday);
}]; // 错误处理
if (error) {
NSLog(@"CoreData Ergodic Data Error : %@", error);
}

以上就是CoreData的基本使用,自己也在不断的完善中,希望上面对大家对CoreData认识会进一步提高。

iOS-CoreData详解与使用的更多相关文章

  1. 【转】IOS AutoLayout详解(三)用代码实现(附Demo下载)

    转载自:blog.csdn.net/hello_hwc IOS SDK详解 前言: 在开发的过程中,有时候创建View没办法通过Storyboard来进行,又需要AutoLayout,这时候用代码创建 ...

  2. IOS SDK详解

    来源:http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html?page=1#42803301 博客专栏>移动开发专栏>I ...

  3. iOS路由详解

    本文如题,路由详解,注定是一篇详细解释iOS路由原理及使用的文章,由于此时正在外地出差,无法详细一一写出,只能不定时的补充. 一.什么是iOS路由 路由一词来源于路由器,可以实现层级之间消息转发的功能 ...

  4. IOS 手势详解

    在IOS中手势可以让用户有很好的体验,因此我们有必要去了解一下手势. (在设置手势是有很多值得注意的地方) *是需要设置为Yes的点击无法响应* *要把手势添加到所需点击的View,否则无法响应* 手 ...

  5. IOS SizeClasses 详解

    SizeClasses 详解 iOS 8在应用界面的可视化设计上添加了一个新的特性-Size Classes.对于任何设备来说,界面的宽度和高度都只分为三种描述:紧凑,任意和宽松.这样开发者便可以无视 ...

  6. iOS模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.

    Write in the first[写在最前] 对于从事 iOS 开发人员来说,当提到 ** runtime时,我想都可以说出来 「runtime 运行时」和基本使用的方法.相信很多开发者跟我当初一 ...

  7. iOS 模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.

    引导 Copyright © PBwaterln Unauthorized shall not be *copy reprinted* . 对于从事 iOS 开发人员来说,所有的人都会答出「runti ...

  8. ios学习--详解IPhone动画效果类型及实现方法

    详解IPhone动画效果类型及实现方法是本文要介绍的内容,主要介绍了iphone中动画的实现方法,不多说,我们一起来看内容. 实现iphone漂亮的动画效果主要有两种方法,一种是UIView层面的,一 ...

  9. coreData详解

    1.初识CoreData CoreData的结构构成: NSManagedObjectModel的构成: 可以通过Entity创建继承自NSManagedObject类的文件,这个文件就是开发中使用的 ...

  10. iOS - keychain 详解及变化

    keychain介绍 iOS keychain 是一个相对独立的空间,保存到keychain钥匙串中的信息不会因为卸载/重装app而丢失, .相对于NSUserDefaults.plist文件保存等一 ...

随机推荐

  1. log4j日志的使用

    1.引架包和导配置文件log4j.properties <dependency> <groupId>org.slf4j</groupId> <artifact ...

  2. JAVA的 IO NIO AIO笔记

        IO      linux内核将所有外部设备都看做一个文件来操作,对一个文件的读写会调用内核系统命令,放回一个file descriptor(文件描述符), 对一个socket的读写也会有相应 ...

  3. Python爬取淘宝店铺和评论

    1 安装开发需要的一些库 (1) 安装mysql 的驱动:在Windows上按win+r输入cmd打开命令行,输入命令pip install pymysql,回车即可. (2) 安装自动化测试的驱动s ...

  4. 可参数化的带优先级的数据选择器的FPGA实现方式探讨

    在FPGA设计中,大部分情况下我们都得使用到数据选择器.并且为了设计参数化,可调,通常情况下我们需要一个参数可调的数据选择器,比如M选1,M是可调的参数. 如果,数据选择器是不带优先级的,我们可以使用 ...

  5. MySQL--MHA原理

    ##==============================================================##MHA(Master High Availability)是一种My ...

  6. Javascript高级编程学习笔记(83)—— 富文本选区(3)

    富文本选区 在富文本编辑器中使用 iframe 的 getSelection() 方法可以获取选中的文本 该方法是 window 对象和 document 对象的属性,调用后会返回一个当前选选择文本的 ...

  7. 巧用这19条MySQL优化,效率至少提高3倍

    阅读本文大概需要 3.8 分钟. 作者丨喜欢拿铁的人 https://zhuanlan.zhihu.com/p/49888088 本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下: 1 ...

  8. 如何将自己的jar包发布到mavan中央仓库

    最近自己写了一个关于网关限流的插件,然后想着肯定会有很多兄弟也需要使用到,所以就想着把jar包上传到Maven的中央仓库上让大家可以更方便的使用 现在咱们来看一下这个流程是什么样的呢. 首先呢,你得去 ...

  9. Git使用详细教程(4):git rm使用详解

    我们使用git rm 文件名来进行删除文件的操作. git rm index.php这个命令把工作区的index.php删除并暂存了. 如何撤回已暂存的删除命令? 上图中已经给出了提示,使用git r ...

  10. CSS3新增伪类--好用的:target

      问:如果让你实现下图,点击跳转后,让内容1增加一个背景颜色,你会怎么做呢? 可能很多小伙伴第一反应是用JS,给跳转绑定点击事件,然后用DOM获取到内容1,在给其添加css样式. 如果我跟你说用cs ...