CoreData / MagicalRecord
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];
MagicalRecord================================================
1. 官网:https://github.com/magicalpanda/MagicalRecord
MagicalRecord是对CoreData的深度封装。使CoreData 代码更简洁,更简单的获取数据,并使用最优化的操作。
> 使用方法:
— 将MagicalRecord 拖曳到工程目录下,并添加CoreData框架。
— 创建CoreData 数据模型DataModel,并创建实体Entity及属性Attribute
— 创建与数据模型中实体对应的类 ,继承自NSManagedObject
— 初始化CoreData堆栈 ,在AppDelegate 中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[MagicalRecord setupCoreDataStackWithStoreNamed:@"fav"];
return YES;
}
— 数据增删改查
增:[Fav MR_createEntity];
// 对创建的新实体赋值
// 同步存储到持久化库中
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
删:[favmodel MR_deleteEntity];
// 同步存储到持久化库中
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
改:// 先查询出要修改的记录
[Fav MR_findFirstByAttribute:@"newsId" withValue:@(m.newsId.integerValue)];
// 更新查出的实体的值
// 同步存储到持久化库中
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
查:[Fav MR_findAll]; // 查询出所有记录
CoreData / MagicalRecord的更多相关文章
- 使用开源库MagicalRecord操作CoreData
1. 将 MagicalRecord 文件夹拖入到工程文件中,引入 CoreData.frame 框架 2. 在 .pch 文件中引入头文件 CoreData+MagicalRecord.h 注: ...
- 使用开源库 MagicalRecord 操作 CoreData
MagicalRecord https://github.com/magicalpanda/MagicalRecord 注意: MagicalRecord 在 ARC 下运作,Core Data ...
- 数据持久化(六)之Using CoreData with MagicalRecord
第五节里面,我介绍了CoreData的配置和主要的增删改查,可能非常多人会认为用它真繁琐.这里,我再介绍网上大神对它进行了人性化封装的第三方MagicalRecord,正如FMDB对sqlite进行了 ...
- iOS - CoreData 数据库存储
1.CoreData 数据库 CoreData 是 iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据.使用 CoreData 框架,程序员可以很轻松有效地通过面向对象的接 ...
- MagicalRecord简单使用小记
一般采用pod安装,导入框架 #import <CoreData+MagicalRecord.h> - (BOOL)application:(UIApplication *)applica ...
- iOS:OC Lib:MagicalRecord
# MagicalRecord 2.1 ## 前言 CoreData是iOS开发中经常使用的数据持久化的技术.但其操作过程稍微繁琐,即使你只是实现简单的存取,不涉及请求优化,也要进行许多配置工作,代码 ...
- Core Data & MagicalRecord
iOS 本地数据持久化存储: 1.plist 2.归档 3.NSUserDefaults 4.NSFileManager 5.数据库 一.CoreData概述 CoreData是苹果自带的管理数据库的 ...
- MagicalRecord使用教程【转载】
原文地址:http://www.ithao123.cn/content-96403.html 下面是在xcode5.1下ARC环境中的使用教程 1. 将 MagicalRecord 文件夹拖入到工程文 ...
- iOS 8 Extensions
本文由海水的味道收集整理,欢迎转载 当前版本 0.0.1 iOS 8 Extensions 一.扩展概述 扩展(Extension)是iOS 8中引入的一个非常重要的新特性.扩展让app ...
随机推荐
- Android 实现瀑布流的两种思路
瀑布流怎么样我就不多介绍了.下面说说我想到的两个方法. 方法一,控件的叠加: ScrollView+LinearLayout.在ScrollView里面加一个水平方向的LinearLayout,在水平 ...
- SQL JOIN使用方法
(转自W3School相关教程:http://www.w3school.com.cn,W3School是不错的在线教程,简洁高效!) 下面列出不同的SQL JOIN类型,以及他们之间的差异: JOIN ...
- Delphi 正则表达式之TPerlRegEx 类的属性与方法(6): EscapeRegExChars 函数
Delphi 正则表达式之TPerlRegEx 类的属性与方法(6): EscapeRegExChars 函数 // EscapeRegExChars 函数可以自动为特殊字符加转义符号 \ var ...
- 转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)
http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常 ...
- webservice -- cxf客户端调用axis2服务端
背景: 有个项目, 需要由第三方提供用户信息, 实现用户同步操作, 对方给提供webservice接口(axis2实现)并也使用axis2作主客户端调用我方提供的webservice接口 起初, 由于 ...
- java项目地址和服务器地址区分
项目地址String filePath = request.getSession().getServletContext().getRealPath("/") + "up ...
- HDU 6351 (Beautiful Now) 2018 Multi-University Training Contest 5
题意:给定数N(1<=N<=1e9),k(1<=k<=1e9),求对N的任意两位数交换至多k次能得到的最小与最大的数,每一次交换之后不能出现前导零. 因为N最多只有10位,且给 ...
- 【Head First Servlets and JSP】笔记22:直接从请求到JSP & 获取Person的嵌套属性
直接从请求到JSP,不经过servlet <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- HCNP学习笔记之ICMP协议与ping原理以及用Python实现ping
一.ICMP协议分析 ICMP:Internet控制报文协议.由于IP协议并不是一个可靠的协议,它不保证数据被成功送达,那么,如何才能保证数据的可靠送达呢? 这里就需要使用到一个重要的协议模块ICMP ...
- GIT使用—安装配置及工作流程
一.Git 与 SVN 区别 GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等. 1.GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CV ...