1. 导入库文件CoreData.framework
2. 在iOS的Core Data 中建Data Model文件 此时有三种选择
  2.1、 选Data Model(如默认名Model.xcdatamodeld)
  2.11 再点击下边的Add Entity按钮(修改名为Person)
  2.12 再在Attributes中添加(成员变量)保存变量信息
  2.13 再创建继承自NSManagedObject的模型Person
  2.14 再在模型.h文件中创建Attributes中添加的成员变量
  2.15 在.m文件中写@synthesize 成员变量;
2.2、 选Mapping Model(不做介绍)
2.3、 选NSManagedObject subclass(不做介绍)
3. 准备CoreData方法
  1.1创建momd(编译后的扩展名)文件路径 1.2在这个文件中创建Person模型(实体) 1.3创建与实体(模型)对应的数据模型类,此类必须继承自  NSManagedObject(在上面2中有详细说明)
  NSString *path = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"];

  在操作之前 别忘记导入CorData.framework 通过path转url对象,将momd文件中的所有的模型(实体)取出放入到NSManagedObjectModel创建的对象中
  作用:添加实体的属性,建立属性之间的关系
  NSManagedObjectModel *objectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path]];

2.准备数据库路径
  NSString *dataPath = [NSString stringWithFormat:@"%@/Documents/myCoreData.db",NSHomeDirectory()];
  NSLog(@"dataPath:%@",dataPath);

3.创建持久化存储协调器 相当于数据库的连接器
  //作用:设置数据存储的名字,位置,存储方式和存储时机
  NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:objectModel];

4.关联数据库
  4.1 关联类型 在iOS开发中一般都是SQLite (轻量级 一般用于小型移动设备)4.2配置nil 写默认即可 4.3数据库路径(字符串路径转url对象)4.4相关模式(操作) nil 4.5错误信息error对象
  NSError *error = nil;
  NSPersistentStore *store = [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL   fileURLWithPath:dataPath] options:nil error:&error];
  判断持久化存储对象是否为空,如果为空说明数据库创建失败
  if (store == nil) {

  NSLog(@"错误信息:%@",error.localizedDescription); //打印报错信息
  }

5.创建上下文对象 取数据(通过CoreData将数据从数据库取出)
  _context = [[NSManagedObjectContext alloc] init];
  将上下文的持久化协调器指定到创建的属性中 (设置上下文对象的协调器)
  _context.persistentStoreCoordinator = coordinator;

  查
  创建查找类,获取查找请求对象,相当于查询语句 根据实体名字Person得到请求对象
  NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
  通过上下文对象执行请求 返回一个数组类型
  NSArray *array = [_context executeFetchRequest:request error:nil];
  NSLog(@"array count:%ld",array.count);

  通过数组创建数组的类方法 初始化_dataArray成员变量
  _dataArray = [NSMutableArray arrayWithArray:array];

6. 增加一个数据模型对象(实体结构对象或实体对象
  第一个参数:增加数据对应的模型(增加一个新的数据 根据名字取)
  第二个参数:上下文对象 注:开发中可以创建多个上下文对象管理不同的数据库,一定保证对应好哪一个上下文对象
  Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:_context];
  分别设置名字和年龄
  person.name = _nameTextField.text;
  person.age = [NSNumber numberWithInteger:[_ageTextField.text integerValue]];

  NSError *error = nil;
  通过上下文对象 调用保存这个方法 传入参数error对象的地址 写入数据库
  BOOL ret = [_context save:&error];
  if (ret) { //ret为真 保存成功 否则失败
  NSLog(@"保存成功");
  将person对象放入到对应的数据 最好刷新表
  [_dataArray addObject:person];
  [_tableView reloadData];
  }else {
  NSLog(@"保存失败:%@",error);
  }
7. 从数据库中删除对象(模型)
  取点击哪个person(点击哪个cell)
  Person *person = _dataArray[_selectedRow];
  这里的删除操作只是在数据库中给了一个删除标记,并没有实际删除数据
  [_context deleteObject:person];
  BOOL ret = [_context save:nil];
  if (ret) {
  NSLog(@"删除成功");
  从数组中删除数组元素(person对象)
  [_dataArray removeObjectAtIndex:_selectedRow];
  刷新表
  [_tableView reloadData];

  }else {
  NSLog(@"删除失败");
  }
8. 修改模型数据
  获取请求对象 理解为sqlite语句
  NSFetchRequest *request = [[NSFetchRequest alloc] init];
  首先通过NSEntityDescription创建实体对象 ,第一个参数实体名字 第二个参数上下文对象 然后给请求对象设置实体
  [request setEntity:[NSEntityDescription entityForName:@"Person" inManagedObjectContext:_context]];

  谓语类 通过谓语指定查询类型 类似于FMDB where条件 这里是通过类方法格式化形式创建
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = 'Aa'"];

  //AND
  //NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = 'As' AND age = 0"];

  //OR
  //Sql语句 FMDB里和这里谓语条件通用 通常提交都和删除、修改、查询结合使用
  //NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = 'As' OR age = 28"];

  给请求对象设置谓语条件 如果不设置谓语条件会将所有数据修改
  [request setPredicate:predicate];

  执行请求 返回数组
  NSArray *array = [_context executeFetchRequest:request error:nil];

  for (Person *person in array) {
  person.name = @"不知道";
  person.age = [NSNumber numberWithInt:8];
  }
  保存(写回)数据库,必须要保存数据库,否则下次进入应用没有修改
  [_context save:nil];
  刷新表
  [_tableView reloadData];

  遍历打印一下
  for (Person *person in _dataArray) {
  NSLog(@"%@",person.name);
  }
9. 查询模型数据
  根据实体名字得到(创建)请求对象
  NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
  创建谓语条件对象
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = '不知道'"];

  like 像 属于一种模糊 开发中经常以什么名字开头去查询 这时候用到like , *代表任意并且B后面不管多少个字符
  //NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like 'Be*'"];

  以a结尾的查询
  //NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like '*a'"];

  名字包含有a的查询
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like '*a*'"];

  给请求对象设置谓语条件对象
  request.predicate = predicate;
  执行请求
  NSArray *array = [_context executeFetchRequest:request error:nil];

  for (Person *person in array) {
  NSLog(@"name:%@ age:%@",person.name,person.age);
  }

注意:
  1.
  @dynamic age;
  告诉编译器代码中用@dynamic修饰的属性,其getter和setter方法在程序运行时动态创建 或者说动态绑定,以便于编译器通过编译(了解)
  @synthesize age (开发中大多数都用@synthesize )
  需要手动创建getter和setter方法的实现

  2. 建议手动创建,文件少
  注:如果想用CoreData管理这个Person类创建出来的对象,必须继承自NSManagedObject,否则CoreData无法操作此类创建出来的对象
  在数据模型中,将简单的数据类型(int float double)转换成对象 用NSNumber

CoreData之增删改查的更多相关文章

  1. iOS CoreData (一) 增删改查

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

  2. CoreData的增删改查

    首先使用CoreData创建Demo,勾上CoreData选项 然后创建Entity对象,点击Add Entity(+)按钮 生成Entity对象 重命名双击Entity选项,然后输入Person 设 ...

  3. iOS CoreData 增删改查详解

    最近在学习CoreData, 因为项目开发中需要,特意学习和整理了一下,整理出来方便以后使用和同行借鉴.目前开发使用的Swift语言开发的项目.所以整理出来的是Swift版本,OC我就放弃了. 虽然S ...

  4. IOS之分析网易新闻存储数据(CoreData的使用,增删改查)

    用过网易新闻客户端的朋友们都知道,获取新闻列表时有的时候他会请求网络有时候不会,查看某条新闻的时候再返回会标注已经查看的效果,接下来分析一下是如何实现的. 首先: 1.网易新闻用CoreData存储了 ...

  5. CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移

    上一篇中我们已经使用CoreData创建了一个SQLite数据库 CoreData的简单使用(一)数据库的创建 现在对数据库进行数据的CRUD(增删改查) 1.Data Model 的设置 创建一个D ...

  6. CoreData 从入门到精通(二) 数据的增删改查

    在上篇博客中,讲了数据模型和 CoreData 栈的创建,那下一步就是对数据的操作了.和数据库一样,CoreData 里的操作也无非是增删改查.下面我们将逐步讲解在 CoreData 中进行增删改查的 ...

  7. IOS-CoreData(增删改查、表关联、分页和模糊查询、多个数据库)

    1>什么是CoreData Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数 ...

  8. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示

    Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...

  9. ASP.NET从零开始学习EF的增删改查

           ASP.NET从零开始学习EF的增删改查           最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...

随机推荐

  1. SVG Use(转)

    转自:http://www.zhangxinxu.com/wordpress/2014/07/introduce-svg-sprite-technology/ 未来必热:SVG Sprite技术介绍 ...

  2. Hadoop的eclipse1.1.2插件的安装和配置

    我的集群使用的hadoop版本是hadoop-1.1.2.对应的eclipse版本也是:hadoop-eclipse-plugin-1.1.2_20131021200005 (1)在eclipse的d ...

  3. Python基础学习之 函数

    阅读目录 第一篇:  函数初识 第二篇:  函数命名空间 作用域 闭包 第三篇:  装饰器 第四篇:  装饰器 面试题错误点 第五篇:  迭代器生成器 第六篇:  生成器进阶 第七篇:  递归 第八篇 ...

  4. Android 属性自定义及使用获取浅析

    一.概述 相信你已经知道,Android 可使用 XML 标签语言进行界面的定义.每个标签中有一个一个的属性,这些属性有相应的属性值.例如: <cn.neillee.composedmenu.R ...

  5. java图像加密

    0 前言 为了保护服务器的图像数据,需要用一个图像加密算法来加密服务器的图像:一开始找了一种基于混沌的图像加密算法,效果还是很理想的,是把矩阵图像上的像素点进行上下左右的混乱:后来发现加密后图像会变大 ...

  6. Ubuntu启动文件破坏启动恢复方法

    reboot后主机登录显示如下图: 解决步骤: 1.fs0:(回车) 2.edit startup.nsh 3.添加下面字段: fs0: cd EFI/ubuntu grubx64.efi 4.重启即 ...

  7. winform + INotifyPropertyChanged + IDataErrorInfo + ErrorProvider实现自动验证功能

    一个简单的Demo.百度下载链接:http://pan.baidu.com/s/1sj4oM2h 话不多说,上代码. 1.实体类定义: class Student : INotifyPropertyC ...

  8. input-file 部分手机不能拍照问题

    曾经遇到一个需求,用户拍身份证上传验证, 然后我卡在了拍照这个点上. 最初采用的是微信的 api,wx.chooseImage, 但随后发现,返回的是一种只有微信才能预览的 url 格式, 但验证是要 ...

  9. 通过自动回复机器人学Mybatis:OGNL+log4j.properties

    imooc视频学习笔记 ----> URL:http://www.imooc.com/learn/154 OGNL规则: 从哪里取?(作用域.取值范围,例如封装入一个对象,该对象就是取值范围) ...

  10. menubar下面的选项不可以输入中文

    这是一个QT5的bug. 1.不用中文,使用英文: 2.先输入中文,然后在属性Action里面的text里改成中文.