一、CoreData的概述。
1.简介
- CoreData ⽤用于做数据持久化,是数据持久化的最佳⽅方式, 适合⼤大数据量的存储和查询
- CoreData不是数据库,CoreData数据的最终存储形式可以是SQLite数据库、XML、二进制、内存里,或者是自定义数据类型来存储数据。
- 使用CoreData,需要导入CoreData框架(如果开始创建新的工程时候✅use CoreData选项,就不用导入了,但是需要在代码中导入)
2.优点
-
使用CoreData操作无无需编写SQL语句
-
SQlite通过使用SQL语句操作对象,CoreData使用面向对象的方式操作数据
-
能够合理管理内存,避免使用sql的麻烦,高效
3.CoreData的主要对象(构成)
- NSManagedObjectContext : 负责应用和数据酷之间的交互(CRUD)
- NSPersistentStoreCoordinator:添加持久化存储助理,是物理数据存储的物理文件和程序之间的联系桥梁,相当于数据库的连接器,负责管理不同对象的上下文
- NSManagedObjectModel :被管理的对象模型,对应定义的模型文件
- NSEntityDescription :实体描述(结构),相当于表格结构
- NSManagedObject:被管理的数据记录,相当于表格的数据记录
- NSFetchRequest :数据请求,相当于查询语句
二、直接使用Core Data 写数据
步骤:
(1)创建数据模型
(2)代码如下
需要导入头文件
NSManagedObjectContext *_context;
1 //1.获取数据模型地址 2 NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"]; 3 //2.读取数据模型 4 NSManagedObjectModel *dataModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:fileURL]; 5 //3.根据model初始化数据助理 6 NSPersistentStoreCoordinator *coodinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:dataModel]; 7 //4.将数据存储到沙盒下 8 NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/coreData.db"]; 9 NSURL *pathURL = [NSURL fileURLWithPath:path]; 10 NSLog(@"%@", path); 11 NSError *error = nil; 12 NSPersistentStore *store = [coodinator addPersistentStoreWithType:NSSQLiteStoreType //存储的形式(我选择的是SQLite存储,还有另外三种) 13 configuration:nil URL:pathURL options:nil error:&error]; 14 if (store == nil) {//数据库存在异常 直接抛异 15 [NSException raise:@"" format:@"error: %@", [error localizedDescription]]; 16 } 17 if (error) { 18 19 NSLog(@"open error :%@", error); 20 }else { 21 22 NSLog(@"open success"); 23 } 24 _context = [[NSManagedObjectContext alloc] init]; 25 _context.persistentStoreCoordinator = coodinator;
***PersistentStoreWithType存储的形式有以下四种:
- NSSQLiteStoreType : SQLite数据库
- NSXMLStoreType:XML存储形式
- NSBinaryStoreType:二进制平面文件
- NSInMemoryStoreType:内存库
虽然这3种类型的性能从速度上来说都差不多,但从数据模型中保留下来的信息却不一样,
在几乎所有的情景中,都应该采用默认设置,使用SQLite作为持久化存储库。
运行结束之后:
可以根据地址去访问:
打开方式:
文件存在查看:
属性添加查看:
可以看出,.使用SQLite存储时,数据库结构存储的SQLite数据库表名称:大写“Z”加上实体名称大写,一个实体相当于一张表,具体的字段名称:大写“Z”加上实体属性名称大写
三、对数据进行操作(增删改)
(1)添加数据。
封装一个方法直接进行数据的添加。
1 //添加数据 2 - (NSManagedObject *)insertEntity:(NSString *)entityName withParams:(NSDictionary *)params { 3 // 1. 根据模型初始化一个对象 4 NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:_context]; 5 //添加的数据内容 6 /*以下数据是字典中的写入数据 7 [object setValue:@"玛瑙" forKey:@"name"]; 8 [object setValue:@18 forKey:@"age"]; 9 */ 10 //用字典接收外部传值 11 for (NSString *key in params) { 12 NSLog(@"%@",key); 13 [object setValue:[params objectForKey:key] forKey:key]; 14 } 15 NSError *error = nil; 16 //保存数据 17 BOOL success = [_context save:&error]; 18 if (success) { 19 NSLog(@"添加数据成功"); 20 }else { 21 NSLog(@"添加数据失败"); 22 } 23 return object; 24 }
(2)查询数据
封装一个方法,用来查询数据。
1 //查询数据 2 - (NSArray *)queryWithEntity:(NSString *)entityName withPredicate:(NSString *)predicate withSortDescriptor:(NSArray *)sorts{ 3 //1.构造一个查询请求 4 NSFetchRequest *request = [[NSFetchRequest alloc] init]; 5 //2.设置查询请求的模型(实体) 6 request.entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:_context]; 7 //3.设置查询条件 8 NSPredicate *dicate = [NSPredicate predicateWithFormat:predicate ]; 9 request.predicate = dicate; 10 //设置分页 11 [request setFetchOffset:0];//读取数据库的游标偏移量,从游标开始读取数据 12 [request setFetchLimit:5];//每次要取多少条数据,5就是每次从数据库读取5条数据 13 // [request setFetchBatchSize:500];//从数据库里每次加载500条数据来筛选数据,用于下拉刷新等 14 if (sorts) { 15 //排序设置 NSSortDescriptor:排序条件 可任意存在多个 16 NSMutableArray *sortArr = [[NSMutableArray alloc] init]; 17 //遍历传入的排序条件字符串数组,生成排序条件 18 for (NSString *sortString in sorts) { 19 //遍历结果 20 NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:sortString ascending:YES]; 21 //加入数组 22 [sortArr addObject:sort]; 23 } 24 //将排序条件的数组查询请求,按数组的前后确定排序的优先级 25 request.sortDescriptors = sortArr; 26 } 27 //4. 执行查询请求 28 NSError *error = nil; 29 NSArray *objects = [_context executeFetchRequest:request error:&error]; 30 if (error) { 31 NSLog(@"查询失败: %@",error); 32 //失败之后返回nil 33 return nil; 34 }else { 35 NSLog(@"查询成功"); 36 } 37 return objects; 38 }
(3)删除数据
删除数据和修改数据都需要用到查询。
1 //删除数据 2 - (void)deleteWithEntity:(NSString *)entityName withPredicate:(NSString *)predicate { 3 //调用查询方法(查询方法是一个数组,因此用 ‘NSArray *’ 接收) 4 NSArray *objects = [self queryWithEntity:entityName withPredicate:predicate withSortDescriptor:nil]; 5 6 for (NSManagedObject *object in objects) { 7 //删除选择的项 8 [_context deleteObject:object]; 9 // NSLog(@"删除成功"); 10 } 11 //使数据库的内容与上下文的内容同步,(我们对数据的增删改都是对上下文的修改,需要通过助理与数据库进行刷新同步。nil是错误码--error) 12 [_context save:nil]; 13 }
由此看出,封装一个好的方法的重要性。
下一篇将介绍两个文件进行连接的方法,以及基于SQLite使用Core Data。
欢迎读者查看,有错欢迎指正。本文是原创文章,如若转载请标明出处。