数据库CoreData 的简单使用(1)

一、CoreData的概述。

  1.简介

  • CoreData ⽤用于做数据持久化,是数据持久化的最佳⽅方式, 适合⼤大数据量的存储和查询
  • CoreData不是数据库,CoreData数据的最终存储形式可以是SQLite数据库、XML、二进制、内存里,或者是自定义数据类型来存储数据
  • 使用CoreData,需要导入CoreData框架(如果开始创建新的工程时候✅use CoreData选项,就不用导入了,但是需要在代码中导入)

 

    2.优点

  • 使用CoreData操作无无需编写SQL语句

  •  SQlite通过使用SQL语句操作对象,CoreData使用面向对象的方式操作数据

  • 能够合理管理内存,避免使用sql的麻烦,高效

  3.CoreData的主要对象(构成)

  1. NSManagedObjectContext :  负责应用和数据酷之间的交互(CRUD)
  2. NSPersistentStoreCoordinator:添加持久化存储助理,是物理数据存储的物理文件和程序之间的联系桥梁,相当于数据库的连接器,负责管理不同对象的上下文
  3. NSManagedObjectModel  :被管理的对象模型,对应定义的模型文件
  4. NSEntityDescription :实体描述(结构),相当于表格结构
  5. NSManagedObject:被管理的数据记录,相当于表格的数据记录
  6. 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。

 

欢迎读者查看,有错欢迎指正。本文是原创文章,如若转载请标明出处。

 

转载于:https://www.cnblogs.com/david-han/p/4878305.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值