1.Core Data提供了一种简便的对象持久化管理方法(是数据持久化的最佳方式),使你可以不用关心数据的存储,只需要关心对象的增加、删除、更改、读写。
Core Data框架提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象在数据操作过程中,无需编写任何SQL语句 要使用Core Data,需要导入CoreData框架
2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型
3.好处:能够合理管理内存,避免使用sql的麻烦,高效
4.构成:
(1)NSManagedObjectContext(被管理的数据上下文),类似数据库句柄,所有的增删改都通过它来操作;这是沙盒中数据库对应在内存中的一个映射,我们主要在这个上下文中请求数据
操作实际内容(操作持久层)
作用:插入数据,查询数据,删除数据
创建:需要设置他的NSPersistentStoreCoordinator 属性才能创建成功
[注:]对上下文进行修改后,一定要对内存中的数据进行保存,否则不能和沙盒中的数据同步,只需调用下面两种方法中的一种即可
//第 一 种 方 式 直 接 保 存 上 下 文
if ([context save:nil]) {
NSLog(@"保存成功---");
} else {
NSLog(@"保存失败===");
};
}
//第二种,调用appdelegate 中的save方法
[myDelegate saveContext];
(2)NSManagedObjectModel(被管理的数据模型)
数据库所有表格或数据结构,包含各实体的定义信息
创建:根据.xcdatamodeld 文件 创建
eg:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"pro_CoreData" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
作用:添加实体的属性,建立属性之间的关系
操作方法:视图编辑器,或代码
(3)NSPersistentStoreCoordinator(数据读取存储助手类,负责接收到上下文的数据请求,并且去数据库中读取,然后返回给上下文)
相当于数据库的连接器
创建:需要设置他的NSManagedObjectModel 属性才能创建成功
作用:设置数据存储的名字,位置,存储方式,和存储时机
(4)NSManagedObject(被管理的数据记录)
相当于数据库中的表格记录
eg:
NSArray *arr = [context executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error];
context 请求返回的arr 中存储的对象即为 NSManagedObject,然后可以通过他来做具体的操作,例如更新tableView数据
(5)NSFetchRequest(获取数据的请求)
相当于查询语句
(6)NSEntityDescription(实体结构)
相当于表格结构
(7)后缀为.xcdatamodeld的包
里面是.xcdatamodel文件,用数据模型编辑器编辑
编译后为.momd或.mom文件
-------------------------------------------------------
简单应用:(添加班级)
1 //拿到APPDelegate 2 //这个对象时一个唯一的,是整个应用程序的代理 3 //[UIApplication sharedApplication] 是拿到整个应用程序 4 5 AppDelegate *myDelegate = [UIApplication sharedApplication].delegate; 6 7 //拿到AppDelegate 中的上下文 8 NSManagedObjectContext *context = myDelegate.managedObjectContext; 9 10 11 //创建一个教室的对象,并且添加到上下文中,然后通过上下文保存到数据库中去 12 13 //实体描述类 14 15 //创建一个在appdelegate的上下文中存在的实例 16 17 NSEntityDescription *entity = [NSEntityDescription entityForName:@"ClassRoom" inManagedObjectContext:context]; 18 19 //根据上面创建的实体描述对象创建一个实体 20 //并且插入到上下文中 21 //执行插入后,这个classroom对象就已经被上下文管理了 22 23 ClassRoom *classRoom = (ClassRoom *)[[ClassRoom alloc] initWithEntity:entity insertIntoManagedObjectContext:context]; 24 25 //被管理对象 --> 创建出来就会被上下文所管理,可以随意修改,修改后上下文中对应的这个对象也改变了 26 27 //被管理对象的修改实际是直接修改的上下文 28 classRoom.name = _className.text; 29 classRoom.classId = @([_classID.text integerValue]); 30 31 32 //直 接 保 存 上 下 文,防止和沙盒数据不同步 33 if ([context save:nil]) { 34 NSLog(@"保存成功---"); 35 } else { 36 NSLog(@"保存失败==="); 37 }