iOS CoreData (一) 增删改查

栏目: 数据库 · 发布时间: 5年前

内容简介:Core Data是iOS5之后才出现的一个框架,提供了直接使用SQLite数据库的大部分灵活性,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象,通过CoreData管理应用程序的数据模型,可以极大程度减少需要编写的代码数量!示例Demo:2、在data Model 中创建项目中需要用到的实体(Entities),例如,创建一个Student 实体(第一字母必须是大写),以及添加一些name、age、sex 等

Core Data是iOS5之后才出现的一个框架,提供了直接使用 SQLite 数据库的大部分灵活性,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象,通过CoreData管理应用程序的数据模型,可以极大程度减少需要编写的代码数量!

示例Demo: CoreDataLearn

iOS CoreData (一) 增删改查

1、首先创建一个coreData 模型文件:系统创建或者自己创建

iOS CoreData (一) 增删改查
iOS CoreData (一) 增删改查

2、在data Model 中创建项目中需要用到的实体(Entities),例如,创建一个Student 实体(第一字母必须是大写),以及添加一些name、age、sex 等属性,如下图

iOS CoreData (一) 增删改查

3、生成对应实体的实体类,在此之前要注意下图两个设置部分,否则会引起崩溃现象

iOS CoreData (一) 增删改查
iOS CoreData (一) 增删改查
iOS CoreData (一) 增删改查
iOS CoreData (一) 增删改查
iOS CoreData (一) 增删改查

4、生成上下文 关联数据库

  • NSManagedObjectContext 管理对象,上下文,持久性存储模型对象,处理数据与应用的交互
  • NSManagedObjectModel 被管理的数据模型,数据结构
  • NSPersistentStoreCoordinator 添加数据库,设置数据存储的名字,位置,存储方式
  • NSManagedObject 被管理的数据记录
  • NSFetchRequest 数据请求
  • NSEntityDescription 表格实体结构

①、自己创建模型文件时需要以下代码来手动生成上下文,关联数据库

//创建数据库
- (void)createSqlite{
    
    //1、创建模型对象
    //获取模型路径
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
    //根据模型文件创建模型对象
    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    
    //2、创建持久化存储助理:数据库
    //利用模型对象创建助理对象
    NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    
    //数据库的名称和路径
    NSString *docStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *sqlPath = [docStr stringByAppendingPathComponent:@"coreData.sqlite"];
    NSLog(@"数据库 path = %@", sqlPath);
    NSURL *sqlUrl = [NSURL fileURLWithPath:sqlPath];
    
    NSError *error = nil;
    //设置数据库相关信息 添加一个持久化存储库并设置类型和路径,NSSQLiteStoreType:SQLite作为存储库
    [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlUrl options:nil error:&error];
    
    if (error) {
        NSLog(@"添加数据库失败:%@",error);
    } else {
        NSLog(@"添加数据库成功");
    }
    
    //3、创建上下文 保存信息 对数据库进行操作
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
   
    //关联持久化助理
    context.persistentStoreCoordinator = store;
    _context = context;

}
复制代码

②、系统创建模型文件时会自动生成关联数据库的代码,在iOS10以下和iOS10之后生成的不一样,出现了一个新类NSPersistentContainer。

NSPersistentContainer是一个容器,封装了应用程序中的CoreData Stack(核心数据栈堆),简化了创建和管理的核心堆栈的数据处理创建NSManagedObjectModel,NSPersistentStoreCoordinator,NSManagedObjectContext。详情可以看看这篇文章: blog.csdn.net/u013263917/…

iOS CoreData (一) 增删改查
iOS CoreData (一) 增删改查
iOS CoreData (一) 增删改查
AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    
    NSPersistentContainer * container = appDelegate.persistentContainer;
    
    //返回沙盒中存储数据库的文件夹URL路径,这是一个静态方法,表示数据库的文件路径是唯一的
    NSURL * url = [NSPersistentContainer defaultDirectoryURL];
    
    NSManagedObjectContext *viewContext = container.viewContext;
    
    NSManagedObjectModel *managedObjectModel = container.managedObjectModel;
    
    NSPersistentStoreCoordinator *persistentStoreCoordinator = container.persistentStoreCoordinator;

    //使用存储调度器快速在多线程中操作数据库,效率非常高(比主线程操作块50倍!!!)
    - (void)performBackgroundTask:(void (^)(NSManagedObjectContext *))block;

复制代码

5.增删改查排

  • 写入数据
// 1.根据Entity名称和NSManagedObjectContext获取一个新的继承于NSManagedObject的子类Student
    Student * student = [NSEntityDescription  insertNewObjectForEntityForName:@"Student"  inManagedObjectContext:_context];
    
    //2.根据表Student中的键值,给NSManagedObject对象赋值
    student.name = [NSString stringWithFormat:@"Mr-%d",arc4random()%100];
    student.age = arc4random()%20;
    student.sex = arc4random()%2 == 0 ?  @"美女" : @"帅哥" ;
    student.height = arc4random()%180;
    student.number = arc4random()%100

    //   3.保存插入的数据
    NSError *error = nil;
    if ([_context save:&error]) {
        [self alertViewWithMessage:@"数据插入到数据库成功"];
    }else{
        [self alertViewWithMessage:[NSString stringWithFormat:@"数据插入到数据库失败, %@",error]];
    }

复制代码
  • 删除数据
- (void)deleteData{
   
    //创建删除请求
    NSFetchRequest *deleRequest = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
    
    //删除条件
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"age < %d", 10];
    deleRequest.predicate = pre;
   
    //返回需要删除的对象数组
    NSArray *deleArray = [_context executeFetchRequest:deleRequest error:nil];
    
    //从数据库中删除
    for (Student *stu in deleArray) {
        [_context deleteObject:stu];
    }
   
    NSError *error = nil;
    //保存--记住保存
    if ([_context save:&error]) {
        [self alertViewWithMessage:@"删除 age < 10 的数据"];
    }else{
        NSLog(@"删除数据失败, %@", error);
    }
}
复制代码
  • 更新修改
//更新,修改
- (void)updateData{
    
    //创建查询请求
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"sex = %@", @"帅哥"];
    request.predicate = pre;
    
    //发送请求
    NSArray *resArray = [_context executeFetchRequest:request error:nil];
    
    //修改
    for (Student *stu in resArray) {
        stu.name = @"且行且珍惜_iOS";
    }
  
    //保存
    NSError *error = nil;
    if ([_context save:&error]) {
        [self alertViewWithMessage:@"更新所有帅哥的的名字为“且行且珍惜_iOS”"];
    }else{
        NSLog(@"更新数据失败, %@", error);
    }  
}
复制代码
  • 读取查询
//读取查询
- (void)readData{
    
    /* 谓词的条件指令
     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. 如果通过对象的key
     path指定匹配条件,需要使用%K
     
     */
    
    //创建查询请求
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
    //查询条件
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"sex = %@", @"美女"];
    request.predicate = pre;
 
    // 从第几页开始显示
    // 通过这个属性实现分页
    //request.fetchOffset = 0;
    // 每页显示多少条数据
    //request.fetchLimit = 6;

    //发送查询请求
    NSArray *resArray = [_context executeFetchRequest:request error:nil];
    
    [self alertViewWithMessage:@"查询所有的美女"];  
}

复制代码
  • 排序
//排序
- (void)sort{
    //创建 排序 请求
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
    //实例化排序对象
    NSSortDescriptor *ageSort = [NSSortDescriptor sortDescriptorWithKey:@"age"ascending:YES];
    NSSortDescriptor *numberSort = [NSSortDescriptor sortDescriptorWithKey:@"number"ascending:YES];
    request.sortDescriptors = @[ageSort,numberSort];
    //发送请求
    NSError *error = nil;
    NSArray *resArray = [_context executeFetchRequest:request error:&error];
    if (error == nil) {
        [self alertViewWithMessage:@"按照age和number排序"];
    }else{
        NSLog(@"排序失败, %@", error);
    }
}

复制代码

CoreData调试:

打开Product,选择Edit Scheme. 选择Arguments,在下面的ArgumentsPassed On Launch中添加下面两个选项,如图: (1)-com.apple.CoreData.SQLDebug (2)1

iOS CoreData (一) 增删改查

示例Github: CoreDataLearn

如果需要跟我交流的话: ※ Github: github.com/wsl2ls ※ 个人博客:wsl2ls.github.io ※ 简书: www.jianshu.com/u/e15d1f644… ※ 微信公众号:iOS2679114653 ※ QQ:1685527540


以上所述就是小编给大家介绍的《iOS CoreData (一) 增删改查》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

App研发录:架构设计、Crash分析和竞品技术分析

App研发录:架构设计、Crash分析和竞品技术分析

包建强 / 机械工业出版社 / 2015-10-21 / CNY 59.00

本书是作者多年App开发的经验总结,从App架构的角度,重点总结了Android应用开发中常见的实用技巧和疑难问题解决方法,为打造高质量App提供有价值的实践指导,迅速提升应用开发能力和解决疑难问题的能力。本书涉及的问题有:Android基础建设、网络底层框架设计、缓存、网络流量优化、制定编程规范、模块化拆分、Crash异常的捕获与分析、持续集成、代码混淆、App竞品技术分析、项目管理和团队建设等......一起来看看 《App研发录:架构设计、Crash分析和竞品技术分析》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具