1.简介sql
使用CoreData操做无无需编写SQL语句数据库
SQlite经过使用SQL语句操做对象,CoreData使用面向对象的方式操做数据数组
可以合理管理内存,避免使用sql的麻烦,高效框架
步骤:性能
(1)建立数据模型大数据
(2)代码以下spa
须要导入头文件code
NSManagedObjectContext *_context; orm
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存储的形式有如下四种:对象
虽然这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。
欢迎读者查看,有错欢迎指正。本文是原创文章,如若转载请标明出处。