• CoreData之增删改查



    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

  • 相关阅读:
    jsp三种注释方法
    MyEclipse 2015优化技巧
    查看是否安装jdk及路径
    hibernate中save()、get()、load()、update()、saveorupdate()、merge()等方法
    MyEclipse更改项目名web发布名字不改问题
    try-catch-finally try中有rerun 是否执行finally
    使用HTML制作网页
    rs(0)与rs("字段名")的区别
    金蝶K3 wise 插件二次开发与配置
    初识触发器(2)
  • 原文地址:https://www.cnblogs.com/GJ-ios/p/5456409.html
Copyright © 2020-2023  润新知