iOS-CoreData详解与使用

2023-05-16

上面已经说完了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 = @3.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认识会进一步提高。

 

转载于:https://www.cnblogs.com/guohai-stronger/p/9254293.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Python之路【第二十五篇】:数据库之pymysql模块

    数据库进阶 一 pymysql模块 pymysql是Python中操作Mysql的模块 xff0c 其使用的方法和py2的MySQLdb几乎相同 二 pymysql模块安装 pip install pymysql 三 执行sql语句 cod
  • centos7 linux中搭建MFS分布式文件系统

    MFS分布式文件系统 mooseFS xff08 moose 驼鹿 xff09 是一款网络分布式文件系统 它把数据分散在多台服务器上 xff0c 但对于用户来讲 xff0c 看到的只是一个源 MFS也像其他类unix文件系统一样 xff0c
  • MAC_BOOKPRO苹果电脑系统常用快捷键大全

    Mac 键盘快捷键 我在品多多上拼的Mac终于到货了 xff0c 安全下车 xff0c 接下来要熟练使用了 xff01 您可以按下某些组合键来实现通常需要鼠标 触控板或其他输入设备才能完成的操作 要使用键盘快捷键 xff0c 请按住一个或多
  • 微信小程序web-view(webview) 嵌套H5页面 唤起微信支付的实现方案

    场景 小程序页面有一个web view组件 xff0c 组件嵌套的H5页面 xff0c 要唤起微信支付 先讲一下我的项目 xff0c 首先我是自己开发的一个H5触屏版的商城系统 xff0c 里面含有购物车 xff0c 订单支付等功能 然后刚
  • Linux-常用命令

    基本命令 查看文件 span class token function ls span span class token comment 列出当前目录文件和文件夹名称 span F span class token comment 输出可以
  • 酒店管理系统(功能结构图、E-R图、用例图)

    功能结构图 用例图 状态图 流程图 数据字典 er图 转载于 https www cnblogs com wang jee p 10828875 html
  • C语言表达分段函数

    void main int x y scanf 34 d 34 amp x if x lt 61 1 y 61 x else if x gt 1 amp amp x lt 10 y 61 2 x 1 else if x gt 61 10 y
  • 拼音转汉字

    description Pinyin to get chinese pinyin from chinese license MIT style authors Bill Lue requires core 1 2 1 39 39 provi
  • windows下C++连接mysql

    平台 xff1a windows c c 43 43 编译器 xff1a vs2017 项目设置 xff1a 项目属性页 xff1a 1 C C 43 43 gt 常规 gt 附加包含目录 gt C Program Files x86 My
  • 制表符概念的理解(c语言角度)

    百度百科给出的答案 xff1a 制表符 xff08 也叫制表位 的功能是在不使用表格的情况下在垂直方向按列对齐文本 比较常见的应用包括名单 简单列表等 也可以应用于制作页眉页脚等同一行有几个对齐位置的行 至于制表符这一概念的由来 xff0c
  • iOS中实现多线程的技术方案

    pthread 实现多线程操作 代码实现 xff1a void run void param for NSInteger i 61 0 i lt 1000 i 43 43 NSLog 64 34 buttonclick zd 64 34 i
  • linux inode 详解 / 线上inode爆满解决方案

    linux inode 详解 线上inode爆满解决方案 本文大量参考阮一峰大神博客 xff0c 整理笔记 之所以写inode文章是由于一次线上问题 xff0c 引发对inode深入的思考 磁盘的inode监控与磁盘空间的监控同等重要 xf
  • vscode调整字体大小

    在vscode中 xff0c 通过setting gt User gt Text Editor gt Font可以调整字体大小 xff0c 但是这里只是调整右侧的代码编辑区域的字体 xff0c 左侧的侧边栏确无法调整字体大小 xff0c 找
  • MyBatis分页插件PageHelper自定义分页逻辑实现

    因为PageHelper对于MySQL的分页逻辑采用的是SQL后面追加limit子句的方式 xff0c 这样在小数据量情况下是没有问题的 但是对于大数据量的时候 xff0c 比如limit 100000 10 xff0c MySQL的运作机
  • 使用estimatedRowHeight的优缺点

    使用estimatedRowHeight的优缺点 1 优点 1 gt 可以降低tableView heightForRowAtIndexPath 方法的调用频率 2 gt 将 计算cell高度的操作 延迟执行了 xff08 相当于cell高
  • 用红蓝3D眼镜在PC上观看3D影片效果并不好

    如题 xff0c 最近试了一下买了副红蓝分色3D眼镜 结果戴上以后放3D蓝光盘只有在画面的静态部分才能正确融像 xff0c 画面上的物体一动起来马上两个像就不能正确融合 xff0c 而是红色部分和蓝色部分直接混在一起闪来闪去 网上找了一圈
  • python----面向对象

    一 面向过程和面向对象优缺点 面向过程 xff1a 优点 xff1a 极大的降低了写程序的复杂度 xff0c 只需要顺着要执行的步骤 xff0c 堆叠代码即可 缺点 xff1a 一套流水线或者流程就是用来解决一个问题 xff0c 代码牵一发
  • Sublime Text Build 3176 安装图文详细教程

    1 著作权声明 1 1 本图文详细教程为 推优创意 原创教程 xff0c 推优创意 拥有著作权 xff0c 未经本人许可 xff0c 谢绝任何形式的全部或部分转载 xff01 违者必究 xff01 1 2 所有文章在 微信公众号 64 推优
  • iOS开发——纯代码界面(UITableViewController)

    创建UITableViewController xff08 表视图控制器 xff09 创建一个类TableViewController继承UITableViewController 1 AppDelegate m中代码如下 xff08 记得
  • iOS-CoreData详解与使用

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