CoreData
之前在学习使用SQLite时, 需要编写大量的sql语句,完成数据的增删改查,但对于不熟悉sql语句的开发人员来说,难度较大,调试程序比较困难。
由此出现CoreData框架,将sql的操作转换成为对象的操作,无需编写sql语句。并且对数据库的操作也可以可视化。
1. CoreData 自iOS5出现的框架,提供了对象-关系映射(ORM)功能。通过此框架可将 对象 转化成数据,存储到SQLite 数据库文件中,
也能将SQLite数据库中的数据转化成对象。CoreData实际上是封装了的SQLite操作的库,封装度高,无需开发人员接触SQL语句。
在CoreData中,需要被映射的对象被称为实体(entity),即sqlite中的表;每个实体都有属性,即sqlite中对应表的字段。
> 使用CoreData
— 先创建模型文件(相当于创建数据库表结构),后缀名 xcdatamodeld
两种方式创建:
a. 可以在创建iOS 工程时,选择 use Core Data, 工程中会自动生成模型文件
b. 创建工程后 New file ,选择iOS ->Core Data -> Data Model
— 添加实体,(添加表)
Add Entity 注意:实体名字首字母大写
— 给实体添加属性 (在表中添加字段)
Attributes -> + 注意:实体属性名字首字母小写
— 如何通过代码访问
先了解CoreData 中的核心对象
1.) Managed Object Model 管理的对象模型
描述应用程序的数据模型,这个模型包含实体(Entity),属性(Property),读取请求(Fetch Request)等。 对应代码中的类:NSManagedObject ,类似于NSDictionary , 通过键-值存取实体属性。
2.)Managed Object Context 管理的对象上下文
参与对数据对象进行各种操作的全过程,并监测数据对象的变化,以提供对 undo/redo 的支持及更新绑定到数据的 UI。
3.)Persistent Store Coordinator 持久化存储协调者
相当于数据文件管理器,处理底层的对数据文件的读取与写入。一般我们无需与它打交道。
4. )Managed Object 管理的对象
数据对象,与 Managed Object Context 相关联。
— 代码访问步骤:
1. )初始化NSManagedObjectModel对象,加载模型文件,读取app中的所有实体信息
2. )初始化NSPersistentStoreCoordinator对象,添加持久化库(这里采取SQLite数据库)
3. )初始化NSManagedObjectContext对象,拿到这个上下文对象操作实体,进行增删改查(CRUD)操作
代码如下:
// 获取应用程序资源束下的数据实体
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
// 以获取的实体初始化持久化存储的协调者(中间桥梁)
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
// 在指定目录下创建持久化存储,基于sqlite类型
NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSURL *url = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"my.db"]];
NSError *err = nil;
NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&err];
// 若创建持久化存储失败,则抛出异常
if (store == nil) {
NSLog(@"error");
[NSException raise:@"error" format:@"%@",[err localizedDescription]];
}
// 创建数据操作的上下文,并指定其持久化存储的协调者
context = [[NSManagedObjectContext alloc] init];
context.persistentStoreCoordinator = psc;
— 将Core Data中的 实体 与 代码中的 数据模型 对应
Core Data中的实体都是NSManagedObject类型的。
创建继承自NSManagedObject的子类
New file->iOS->Core Data-> NSManagedObject
这样在代码中可通过 favorite.NewsId 来访问实体属性,而不是之前的 [nsManagedObject setValue: forKey:], [nsManagedObject valueForKey:];
-- 增,删,改,查
增: // 先以数据实体为原型生成一个实体对象
Favorite *fr = [NSEntityDescription insertNewObjectForEntityForName:@"Favorite" inManagedObjectContext:context];
// 赋值操作
// 通过上下文保存此次增加
[context save:&err];
删:// 先初始化抓取数据的请求,指定其抓取何种类型的实体对象
[[NSFetchRequest alloc] initWithEntityName:@"Favorite"];
// 指定其筛选数据的条件
request.predicate = [NSPredicate predicateWithFormat:@"newsId = %@",@(objId)];
// 执行抓取请求
[context executeFetchRequest:request error:nil];
// 删除找到的数据
[context deleteObject:obj];
// 务必通过上下文同步到数据存储
[context save:&err];
改: // 先初始化抓取数据的请求,指定其抓取何种类型的实体对象
[[NSFetchRequest alloc] initWithEntityName:@"Favorite"];
// 指定其筛选数据的条件
request.predicate = [NSPredicate predicateWithFormat:@"newsId = %@",@(objId)];
// 执行抓取请求
[context executeFetchRequest:request error:nil];
// 修改实体对象的值
// 务必通过上下文同步到数据存储
[context save:&err];
查: // 先初始化抓取数据的请求,指定其抓取何种类型的实体对象
[[NSFetchRequest alloc] initWithEntityName:@"Favorite"];
// 指定其筛选数据的条件
request.predicate = [NSPredicate predicateWithFormat:@"newsId = %@",@(objId)];
// 执行抓取请求
[context executeFetchRequest:request error:nil];
CoreData的更多相关文章
- iOS基本数据库存储方式 - CoreData
CoreData 创建模型文件的过程 1.选择模板 2.添加实体 3.添加实体的属性[注意]属性的首字母必须小写 一.CoreData管理类(必备以下三个类对象) 1.CoreData数据操作的上下文 ...
- iOS CoreData 中 objectID 的不变性
关于 CoreData的 objectID 官方文档有这样的表述:新建的Object还没保存到持久化存储上,那么它的objectID是临时id,而保存之后,就是持久化的id,不会再变化了. 那么,我想 ...
- CoreData __ 基本原理
操作过程 Context想要获取值,先要告诉连接器,我要什么东西 链接器再告诉store, 你给我什么东西, store去找 找到之后返回给链接器,链接器再返回给Context Co ...
- iOS CoreData primitive accessor
Given an entity with an attribute firstName, Core Data automatically generates firstName, setFirstNa ...
- 初识CoreData与详解
Core Data数据持久化是对SQLite的一个升级,它是iOS集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类. (1)NSManagedObjectModel(被管 ...
- CoreData教程
网上关于CoreData的教程能搜到不少,但很多都是点到即止,真正实用的部分都没有讲到,而基本不需要的地方又讲了太多,所以我打算根据我的使用情况写这么一篇实用教程.内容将包括:创建entity.创建r ...
- CoreData和SQLite多线程访问时的线程安全
关于CoreData和SQLite多线程访问时的线程安全问题 数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常 ...
- IOS数据存储之CoreData使用优缺点
前言: 学习了Sqlite数据之后认真思考了一下,对于已经习惯使用orm数据库的开发者或者对sql语句小白的开发者来说该如何做好数据库开发呢?这个上网搜了一下?看来总李多虑了!apple 提供了一种数 ...
- iOS开发之表视图爱上CoreData
在接触到CoreData时,感觉就是苹果封装的一个ORM.CoreData负责在Model的实体和sqllite建立关联,数据模型的实体类就相当于Java中的JavaBean, 而CoreData的功 ...
随机推荐
- .NET足球赛事资料数据库平台SmartLottery开源发布——全球足球联赛应有尽有
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 前2个月,我的系列文 ...
- JDBC与JAVA数据库编程
一.JDBC的概念 1. JDBC (Java DataBase Connectivity) Java数据库连接 a) 主要提供java数据库应用程序的API支持 2. JDBC的主要功能 a) 创建 ...
- 从零开始构建 Wijmo & Angular 2 小应用
中秋之际,Angular 团队发布 Angular 2 正式版,一款不错的图表控件Wijmo当天宣布支持 . Angular 2移除和替代了 Angular 1.X 中的 directives, co ...
- 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案
之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...
- PowerPoint基础
一.基础 默认后缀ppt,pptx office2003和以后的版本只支持ppt, 可以将pptx另存为ppt97-2003 二.修改PPT尺寸 三.新建幻灯片 四.字体与段落设置 五.主题与字体 六 ...
- js的并行加载以及顺序执行
重新温习了下这段内容,发现各个浏览器的兼容性真的是搞大了头,处理起来很是麻烦. 现在现总结下并行加载多个js的方法: 1,对于动态createElement('script')的方式,对所有浏览器都是 ...
- 4-MSP430定时器_定时器中断
一开始没写好就上传了,,,,,,,,这次来个全的 自己学MSP430是为了写一篇关于PID的文章,需要430在proteus上做仿真,一则认为在自动控制算法上PID真的很经典,PLC设备上大多是模块式 ...
- 使用webstom或者idea上传代码到github或coding
鉴于github网络速度太慢,建议用coding.先介绍github上传方式,因为webstom或idea集成了github,方法简单. git是一个版本控制器,他的作用是管理代码.比如你修改了代码, ...
- SQL Server 2016里的sys.dm_exec_input_buffer
在你的DBA职业里,你们谁有用过DBCC INPUTBUFFER命令,来获得已经提交到SQL Server特定会话的最后SQL语句?请举手!大家都用过! 我们都知道DBCC命令有点尴尬,因为你不能在T ...
- 【那些年关于MyEclipse的快捷键大全】
MyEclipse 快捷键1(CTRL)-------------------------------------Ctrl+1 快速修复Ctrl+D: 删除当前行 Ctrl+Q 定位到最后编辑的地方 ...