CoreData 的增删改查

基本的增删改查的操作

1 数据库的创建

- (void)createDB
{// 1.1 创建路径NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"AT_CoreDataDemo1" withExtension:@"momd"];// 1.2 根据模型文件路径创建模型对象NSManagedObjectModel *model = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelURL];// 2.1 创建持久化存储器 管理数据库// 传入模型的对象NSPersistentStoreCoordinator *storeCoord = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:model];// 3 数据库存放的路径// doc 文件夹路径NSString *docStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES) lastObject];// 数据库路径NSString *sqlPath = [docStr stringByAppendingPathComponent:@"student.sqlite"];//  4 设置数据库相关的信息//  存储器sqlite 类型NSError *error = nil;[storeCoord addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlPath] options:nil error:&error];if (!error) {NSLog(@"数据库创建成功--%@",sqlPath);}else{NSLog(@"数据库创建失败");}// 创建上下文 对数据库进行操作NSManagedObjectContext *context = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];// 关联协调器context.persistentStoreCoordinator = storeCoord;// 关联全局的上下文 以便于操作数据库_context = context;}

2 插入数据

// 插入一条数据操作
- (IBAction)insertAction:(UIButton *)sender {// 1.根据Entity名称和NSManagedObjectContext获取一个新的继承于NSManagedObject的子类StudentStudent *stu = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:_context];stu.name = [NSString stringWithFormat:@"编号%d",arc4random()% 1000];stu.age =  [[NSString stringWithFormat:@"%d",arc4random()% 100] integerValue];//    stu.sex = (arc4random()%100) / 2 ? @"男":@"女";//2 查询所有的请求NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"Student"];// 执行操作NSError *error = nil;[_context executeRequest:req error:&error];[_dataSource removeAllObjects];[_dataSource addObjectsFromArray:[_context executeFetchRequest:req error:nil]];[self.tableView reloadData];// 3 讲数据插入到数据库NSError *error2= nil;if ([_context save:&error2]) {NSLog(@"保存数据成功");}else{NSLog(@"保存数据失败");}NSLog(@"%@",_dataSource);}

2 更新数据

// 更新数据操作
- (IBAction)updateAction:(UIButton *)sender {// 1 创建查询请求NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"Student"];// 不添加任何条件的查询就是讲所有的数据查询出来// 使用谓词 过滤条件NSPredicate *pre = [NSPredicate predicateWithFormat:@"age > %d", 50];req.predicate = pre;// 1.1 请求结果NSArray *resArr = [_context executeFetchRequest:req error:nil];// 2 更新数据for (Student *stu in resArr) {stu.name = @"标记:年龄已经大于50的人";}[_dataSource removeAllObjects];[_dataSource addObjectsFromArray:resArr];// 3 进行保存操作NSError *error= nil;if ([_context save:&error]) {NSLog(@"保存数据成功");}else{NSLog(@"保存数据失败");}}

3 删除数据

- (IBAction)deleteAction:(UIButton *)sender {// 1 创建删除请求NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"Student"];// 不添加任何条件的查询就是讲所有的数据查询出来// 使用谓词 过滤条件NSPredicate *pre = [NSPredicate predicateWithFormat:@"age > %d && age < %d", 40,60];req.predicate = pre;NSArray *resArr = [_context executeFetchRequest:req error:nil];[_dataSource removeAllObjects];[_dataSource addObjectsFromArray:resArr];[self.tableView reloadData];// 2 查询出来的数据进行删除操作for (Student *stu in resArr) {[_context deleteObject:stu];}// 3 进行操作操作NSError *error= nil;if ([_context save:&error]) {NSLog(@"删除数据成功");}else{NSLog(@"删除数据失败");}}

4 排序数据

- (IBAction)orderAction:(UIButton *)sender {//创建排序请求NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];//实例化排序对象 将年龄按照升序排列NSSortDescriptor *ageSort = [NSSortDescriptor sortDescriptorWithKey:@"age"ascending:YES];// 可以添加多个筛选条件request.sortDescriptors = @[ageSort];NSArray *resArray = [_context executeFetchRequest:request error:nil];[_dataSource removeAllObjects];_dataSource = [NSMutableArray arrayWithArray:resArray];[self.tableView reloadData];}

5 查询数据

// 查询数据
- (IBAction)queryAction:(UIButton *)sender {/* 谓词的条件指令1.比较运算符 > 、< 、== 、>= 、<= 、!=例:@"number >= 99"2.范围运算符:IN 、BETWEEN例:@"number BETWEEN {1,5}"@"address IN {'shanghai','nanjing'}"3.字符串本身:SELF例:@"SELF == 'APPLE'"4.字符串相关:BEGINSWITH、ENDSWITH、CONTAINS例:  @"name CONTAIN[cd] 'ang'"  //包含某个字符串@"name BEGINSWITH[c] 'sh'"    //以某个字符串开头@"name ENDSWITH[d] 'ang'"    //以某个字符串结束5.通配符:LIKE例:@"name LIKE[cd] '*er*'"   //*代表通配符,Like也接受[cd].@"name LIKE[cd] '???er*'"*注*: 星号 "*" : 代表0个或多个字符问号 "?" : 代表一个字符6.正则表达式:MATCHES例:NSString *regex = @"^A.+e$"; //以A开头,e结尾@"name MATCHES %@",regex注:[c]*不区分大小写 , [d]不区分发音符号即没有重音符号, [cd]既不区分大小写,也不区分发音符号。7. 合计操作ANY,SOME:指定下列表达式中的任意元素。比如,ANY children.age < 18。ALL:指定下列表达式中的所有元素。比如,ALL children.age < 18。NONE:指定下列表达式中没有的元素。比如,NONE children.age < 18。它在逻辑上等于NOT (ANY ...)。IN:等于SQL的IN操作,左边的表达必须出现在右边指定的集合中。比如,name IN { 'Ben', 'Melissa', 'Nick' }。提示:1. 谓词中的匹配指令关键字通常使用大写字母2. 谓词中可以使用格式字符串3. 如果通过对象的keypath指定匹配条件,需要使用%K*/// 1 创建查询请求NSFetchRequest *req =[NSFetchRequest fetchRequestWithEntityName:@"Student"];// 过滤条件NSPredicate *pre = [NSPredicate predicateWithFormat:@"age > 80"];req.predicate = pre;// 通过这个属性实现分页//request.fetchOffset = 0;// 每页显示多少条数据//request.fetchLimit = 6;NSArray *resArray = [_context executeFetchRequest:req error:nil];_dataSource = [NSMutableArray arrayWithArray:resArray];[self.tableView reloadData];}

6 获取查询条件的数据数

在开发过程中,有时候只需要所需数据的count值,如果像之前一样获取所有对象加载到内存,在去遍历是比较消耗内存的。

苹果提供了两种方式,去直接查询count值,count值的查询是在数据库层面完成的,不需要将托管对象加载到内存中,避免内存的大开销。

  1. resultType 通过设置NSFetchRequest 对象的resultType 来获取count 值
    // 1 创建查询请求NSFetchRequest *req =[NSFetchRequest fetchRequestWithEntityName:@"Student"];// 过滤条件NSPredicate *pre = [NSPredicate predicateWithFormat:@"age > 80"];req.predicate = pre;// 设置查询获取数量req.resultType = NSCountResultType;// 只查询数量 不查询对象NSArray *resArray = [_context executeFetchRequest:req error:nil];// 执行查询操作,数组中只返回一个对象,就是计算出的count 值NSInteger count = [resArray.firstObject integerValue];NSLog(@"count--%ld",count);

2 直接调用countForFetchRequest 方法获取数量

    // 1 创建查询请求NSFetchRequest *req =[NSFetchRequest fetchRequestWithEntityName:@"Student"];// 过滤条件NSPredicate *pre = [NSPredicate predicateWithFormat:@"age > 80"];req.predicate = pre;// 只查询数量 不查询对象NSArray *resArray = [_context executeFetchRequest:req error:nil];// 执行查询操作,数组中只返回一个对象,就是计算出的count 值NSUInteger count = [_context countForFetchRequest:req error:nil];NSLog(@"count--%ld",count);

02-CoreData 的增删改查相关推荐

  1. iOS CoreData (一) 增删改查

    代码地址如下: http://www.demodashi.com/demo/11041.html Core Data是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系 ...

  2. mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数

    mybatis复习02,简单的增删改查 创建数据表 user_info 在项目中创建数据表对应的实体类 UserInfo.java 在pom.xml文件中引入依赖 创建核心配置文件mybatis-co ...

  3. 华山论剑之iOS中(数组,字典,SQLite,CoreData)的“增删改查“

    我们的生活态度就应该是 "不抱怨" ! 其实我想写这篇文章很久了,因为自己做的iOS开发 ,对数据这一块有这极高的要求.所以一些必须的存储数据的使用,我们都有必要熟悉用法.在以前我 ...

  4. CoreData之增删改查

    1. 导入库文件CoreData.framework 2. 在iOS的Core Data 中建Data Model文件 此时有三种选择 2.1. 选Data Model(如默认名Model.xcdat ...

  5. CoreData里的增删改查

    沿着上篇 https://blog.csdn.net/SwiftIOS_watsUp/article/details/100006664 本篇继续讲CoreData,主要是如何在CoreData里增删 ...

  6. 【SpringBoot集成ElasticSearch 02】Java HTTP Rest client for ElasticSearch Jest 客户端集成(配置+增删改查测试源码)【推荐使用】

    1.简介 SpringBoot 项目初始化时就有 NoSQL 选项 Spring Data Elasticsearch(Access+Driver) 此时 pom 文件里引入的依赖是 spring-b ...

  7. 02.Mybatis的动态代理方式实现增删改查

    动态代理的方式实现增删改查: 通过约定的方式定位sql语句 约定 > 配置文件 > 硬编码 约定的目标是省略掉通过硬编码的方式定位sql的代码,通过接口直接定位出sql语句,以下代码为通过 ...

  8. 【02】Java进阶:18-MySQL基础、数据库概述、数据库的安装/卸载/启动/登录、SQL概述、DDL操作数据库、DDL操作表、DML增删改查、

    day18-MySql基础 今日内容 数据库概述 数据库安装和卸载 SQL语句 DDL-----操作数据库,操作表 DML-----操作记录(增删改) DQL------操作记录(查) 学习目标 能够 ...

  9. Java对象转JSON时如何动态的增删改查属性

    1. 前言 日常开发中少不了 JSON 处理,少不了需要在 JSON 中添加额外字段或者删除特定字段的需求.今天我们就使用Jackson类库来实现这个功能. 2. JSON 字符串增加额外字段 假如我 ...

最新文章

  1. 【kudu pk parquet】TPC-H Query2对比解析
  2. 织梦html编辑器功能在哪,织梦dede自带编辑器替换百度ueditor编辑器
  3. 前端学习(2484):发表更新
  4. 能用10块大洋去解决的事,千万不要用时间
  5. ttc文件linux安装,centos系统安装中文字体几种方法
  6. 腾讯视频QLV格式转换为MP4格式
  7. Intellij IDEA 2019 最新优化配置
  8. 最新小程序反编译的获取流程
  9. hdu 2881 Jack's struggle(DP)
  10. java万能引用_Java的四种引用方式
  11. Mq报错:Caused by: com.rabbitmq.client.ShutdownSignalException
  12. OSDI 2021 VEGITO 论文阅读
  13. web2——影评网页
  14. 7700系列交换机集群(堆叠)实践
  15. 淘宝(客户端)上的店家里面的视频是如何下载的
  16. java一般放在哪个文件里_JDK安装完成后,主要的命令如Javac、Java等都存放在( )文件夹中。...
  17. wamp5 Apache启动失败的解决方法
  18. dav/umi打包配置逻辑
  19. U盘识别不了解决方案
  20. no target connected 和 unknown target connected

热门文章

  1. 搭建turnserver
  2. JS下计算当前日期(当天)后N天出现NAN或者undefined的情况
  3. Nginx负载均衡配置实例详解
  4. ios 如何改变UISegmentedControl文本的字体大小?
  5. uboot readme 文件 (1)
  6. Test class should have exactly one public constructor解决办法
  7. [转贴]2006十大经典语句
  8. 到底什么是hash?它起什么作用?
  9. Java飞行记录器 JRockit Flight Recorder JFR诊断JVM的历史性能和操作
  10. C++11中std::forward_list单向链表的使用