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的更多相关文章

  1. 使用开源库MagicalRecord操作CoreData

      1. 将 MagicalRecord 文件夹拖入到工程文件中,引入 CoreData.frame 框架 2. 在 .pch 文件中引入头文件 CoreData+MagicalRecord.h 注: ...

  2. 使用开源库 MagicalRecord 操作 CoreData

    MagicalRecord  https://github.com/magicalpanda/MagicalRecord 注意:  MagicalRecord 在 ARC 下运作,Core Data ...

  3. 数据持久化(六)之Using CoreData with MagicalRecord

    第五节里面,我介绍了CoreData的配置和主要的增删改查,可能非常多人会认为用它真繁琐.这里,我再介绍网上大神对它进行了人性化封装的第三方MagicalRecord,正如FMDB对sqlite进行了 ...

  4. iOS - CoreData 数据库存储

    1.CoreData 数据库 CoreData 是 iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据.使用 CoreData 框架,程序员可以很轻松有效地通过面向对象的接 ...

  5. MagicalRecord简单使用小记

    一般采用pod安装,导入框架 #import <CoreData+MagicalRecord.h> - (BOOL)application:(UIApplication *)applica ...

  6. iOS:OC Lib:MagicalRecord

    # MagicalRecord 2.1 ## 前言 CoreData是iOS开发中经常使用的数据持久化的技术.但其操作过程稍微繁琐,即使你只是实现简单的存取,不涉及请求优化,也要进行许多配置工作,代码 ...

  7. Core Data & MagicalRecord

    iOS 本地数据持久化存储: 1.plist 2.归档 3.NSUserDefaults 4.NSFileManager 5.数据库 一.CoreData概述 CoreData是苹果自带的管理数据库的 ...

  8. MagicalRecord使用教程【转载】

    原文地址:http://www.ithao123.cn/content-96403.html 下面是在xcode5.1下ARC环境中的使用教程 1. 将 MagicalRecord 文件夹拖入到工程文 ...

  9. iOS 8 Extensions

       本文由海水的味道收集整理,欢迎转载    当前版本 0.0.1  iOS 8 Extensions 一.扩展概述 扩展(Extension)是iOS 8中引入的一个非常重要的新特性.扩展让app ...

随机推荐

  1. 006-虚拟机中centos7实现nat静态ip上网

    1.设置虚拟机网卡VMnet8 2.修改虚拟机参数 (1).点击编辑-->虚拟网络编辑器,如下图设置 (2)nat设置如下[使用默认即可,记住网关.掩码等,非常重要,因为在centos里面要设置 ...

  2. 008-CentOS添加环境变量

    在Linux CentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行“php -v”命令查看当前php版本信息时时, ...

  3. Jquery 实现跨域处理

    JS部分代码: $.ajax({ url:url, dataType:'jsonp', data:{title:title}, jsonp:'callback', success:function(l ...

  4. python3条件表达式和字符串

    1.布尔表达式 布尔表达式的值只有两个:真和假.在python中,真值为1,假值为0 2.逻辑操作符 三种逻辑操作:and.or.not 3.条件语句 if. if...else.if...elif. ...

  5. elastic job配置

    zookeeper注册中心配置 1 package com.zwh.pay.account.worker; import com.dangdang.ddframe.job.reg.zookeeper. ...

  6. JSP与Servlet之后台页面单条删除与多条删除的页面跳转之实现

    单条删除页面跳转 1.首先打开JSP页面,找到删除 2.这个时候要把它改成servlet的URL,并决定要传给后台什么数据,例如我需要传一个待删数据的ID id并不是什么见不得人的东西(而且是后台也不 ...

  7. 较常用的Math方法及ES6中的扩展

    记录下与Math有关的常用方法,如:求最大值.最小值等,或者是保留几位数啥的 1.数据 let floatA = 2.325232; let floatB = 2.3456; let temporar ...

  8. 关于camera 构架设计的一点看法

    camera的构架目前来看有两种,一种是集中式管理,比如说建立一个引擎,引擎向上提供接口,向下管理所有模块.把camera的所有功能划分为不同的模块,又引擎统一管理.模块的结构就比较随意了,可以统一接 ...

  9. Spring_泛型依赖注入

  10. Mysql数据库导出sql脚本

    1. 运行环境Centos mysqldump -h localhost -u root -p etv > ./etv.sql etv 是要导出的数据库名 > 设置导出的路径和文件名