东风不与周郎便,铜雀春深锁二乔!<太阳珊瑚>
-
<big>CoreData</big> 数据持久化框架是Cocoa API的一部分,它允许按照 实体-属性-值 模型组织数据,并以XML(做MAC-os用), 二进制, 或者SQLite数据文件的格式持久化数据. CoreData主要提供 对象-关系映射(ORM)功能,把OC对象转化为数据保存到文件,也可以数据转化成OC对象.
-
CoreData与SQLite区别 :
- CoreData是官方推出的数据持久化框架,SQLite是苹果使用别人开发好的一个动态库,本质是关系型数据库.
- CoreData是iOS平台下的一个数据持久化的方式,不可以跨平台使用,Sqlite可以跨平台使用.
- —- CoreData —–
1: 可视化,不用再写 SQL 语句,大量简化代码.
2: 可以实现多种文件格式 : NSSQLLiteStoreType, BSXMLStoreType 等
3: 与iOS紧密结合, 只能用于开发iOS.
4: 存储内容, 以对象的形式存储, 符合面向对象的思想.
- —- SQLite —-
1: 是一个轻量级数据库而且功能强大的关系型数据库, 很容易被嵌入到应用当中, 可移植性高, 可以在多个平台使用.
2: 和CoreData 不一样的是, SQLite 是使用程序式的.sql的主要操作方法,是直接操作数据
3: 基于C接口, 使用SQL语句, 代码繁琐.
4: 在处理大量数据时,表关系更直观一些,
5: OC中不是可视化的
-
核心对象:
NSPersistentStoreCoordinator 数据连接器类(中间人,不能直接控制)
NSManagedObjectContext 数据管理器类 (临时数据库 )
NSManagedObject 数据管理类
NSManagedObject 数据模型器类
NSEntityDescription 实体描述类
- NSManagedObjectContext (被管理的上下文)
1: 操作实际内容 (对持久层的一个操作)
2: 插入数据, 查询数据, 删除数据,修改数据
3: 是我们开发中主要交互的类, 数据的CRUD都通过这个Context(上下文)去触发命令并返回结果.
-
NSManagedObjectModel (被管理的数据模型)
1: 包含了各个实体(表)的定义信息, 包含了表或者是数据库的结构.
2: 用来添加实体的属性,建立属性之间的关系.
3: 操作方法: 视图编辑器,也可以用代码.
4: 构建整个数据库的表结构, 表字段类型, 表与表之间的关系等等, 凡是和数据结构有关系的定义, 通通都通过这个类来管理. -
NSPersistentStoreCoordinator (持久化数据助理)
1: 相当于数据库的连接器
2: 作用: 设置数据存储的名字, 位置,存储方式, 存储时机.
3: 原理: 从下层文件取出数据, 交给上层的被管理的对象上下文
4: 实际上这个类才是真正意义上跟数据库(.sqlite文件)打交道的,主要是根据 NSManagedObjectModel 执行表结构的建立通过 NSManagedObjectContext的命令执行数据交互. -
操作的思想流程:
context想要获取值,先要告诉连接器,我要什么东西,连接器再告诉store,你给我什么东西,store去找,找到之后返回给context.
CoreData核心关系类
CoreData 数据库的简单操作:
.xcdatamodeld里:
- Add Entity 添加实体类
- 修改实体类名
- 修改属性名与类型
- 创建文件 command+N —> CoreData —> NSManageObjuect subclass
一般使用的步骤:
// 导入CoreData框架
// 导入需要的类
#import <CoreData/CoreData.h>#import \"Person.h\"#import \"AppDelegate.h\"
第一步: 当前自身的数据库连接器与APP的绑定
//通过单例的代理协议的代理人,获取到我们最开始使用的 AppDelegateAppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;//获得 数据库的数据连接器 (定义一个`@property (nonatomic, strong) NSManagedObjectContext *objectContext;`)self.objectContext = app.managedObjectContext;
- 向数据库添加数据:
方式1:
/NSEntityDescription :实体描述类,通过类方法创建
//参数1 :表示这个实体描述类描述的是哪个实体
//参数2 :表示的是在context里创建一个描述,告诉context我要往里面插入以object了
NSEntityDescription *description = [NSEntityDescriptionentityForName:@\”Person\” inManagedObjectContext:self.objectContext];
//创建一个实体类
//参数1 :实体类描述
//参数2 :在context里放入这个类
Person person = [[Person alloc] initWithEntity:description insertIntoManagedObjectContext:self.objectContext];
方式2: 上面的两步骤合并为一个步骤
/
Person *person = [NSEntityDescription insertNewObjectForEntityForName:@\”Person\” inManagedObjectContext:self.objectContext];
/
//把context保存到本地
//这个方法执行之后,本地数据才发生改变
NSErrorerror =nil;
[self.objectContext save:&error];
if(error ==nil)
{
NSLog(@\”保存正确\”); // 可以再次重新加载数据
}else
{
NSLog(@\”错误%@\”,error);
}
- 删除数据>```code// 获取想要删的数据 依情况而定Person *person = self.dataArray[indexPath.row];// 在context中将这条数据删除[self.objectContext deleteObject:person];NSError *error = nil;// 保存一下[self.objectContext save:&error];if (error == nil) {NSLog(@\"删除成功\");}```- 修改数据>```code// 知道改谁 找到你要改的对象Person *person = self.dataArray[indexPath.row];// 修改值int number = arc4random() % 2000;person.name = [NSString stringWithFormat:@\"%d 好\", number];// 保存修改的东西到数据库NSError *error = nil;[self.objectContext save:&error];if (error == nil){NSLog(@\"修改成功了\");}
- 查询数据
//创建一个查询操作,查询哪个表里的内容
NSFetchRequestrequest = [[NSFetchRequest alloc] initWithEntityName:@\”Person\”];
//接收查询数据
NSErrorerror =nil;
// 返回的是一个查询结果的数组所以接收一下
NSArray*array = [self.objectContext executeFetchRequest:request error:&error];
//判断error
if(error ==nil) {
//如果是,那就查到成功 可以放到dataArray里面然后去加载视图显示 可以通过谓词按照你的需求去查找
NSLog(@\”查找成功!\”);
}
------------------多表的关联--------------![](http://upload-images.jianshu.io/upload_images/1523603-bb23784e6b24dd72.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)![](http://upload-images.jianshu.io/upload_images/1523603-708c69d7eb4b4925.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)![](http://upload-images.jianshu.io/upload_images/1523603-192a931d8284a4f8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)![](http://upload-images.jianshu.io/upload_images/1523603-a10ba49d8614c0d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)![](http://upload-images.jianshu.io/upload_images/1523603-82d7510c0611d0b5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)