简单说明

coreData是苹果提供的数据本地化的解决方案中的一种,实质还是提供数据库去存储数据,只是在coreData中不需要程序员手动创建数据库文件,由coreData自动创建。 coreData的核心文件和类 1.模型文件:后缀是.xcdatamodeld的文件,相当于数据库文件(数据库文件代言人) 2.实体:相当于表 3.实体类:存储对象对应的类 4.上下文:关联模型文件和实际生成的数据库文件(对上下文的操作就相当于对数据库进行操作) 使用步骤 1.创建模型文件(已经自动创建完成,但是要在创建工程的时候勾选coreData的选项)

2.创建实体(手动的在模型文件中添加一个实体,并且添加对应的属性)3.创建实体类(使用的时候直接使用类文件去操作属性,不用导入类别文件(7.0以上才有)) 4.生成一个上下文(上下文已经自动生成,只需要直接拿过来使用) 5.数据的增删改查(都是基于数据的查询)

1.获取上下文

既然上面说到上下文是关联模型文件和实际生成的数据库文件,对上下文的操作就相当于是对数据库进行操作,那么这里的上下文就相当于是一个数据库操作者,那么我们就要获取到这个上下文。 首先先声明一个上下文

    // 声明上下文NSManagedObjectContext *_context;
复制代码
    // 1.获取上下文(相当于打开数据库)// 拿到应用程序的delegateAppDelegate *delegate = [UIApplication sharedApplication].delegate;_context = delegate.managedObjectContext;
复制代码

coreData还是对数据的操作,那就一定离不开数据的增删改查。

2.增加数据

1.插入单条数据

    // 1.创建需要插入的对象(可以像alloc出来的对象一样的使用,只是多了一些功能)/***  @param NSString 实体名(相当于表名)*  @return 上下文(相当于数据库)*/Student *stu = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:_context];
复制代码
    // 2.给对象的属性进行赋值stu.name = @"wj";stu.age = @25;stu.sex = @"未知";
复制代码
    // 3.保存数据库// 参数:错误信息// 返回值:执行结果BOOL ret = [_context save:nil];if (ret) {NSLog(@"保存成功");}else {NSLog(@"保存失败");}
复制代码

这样就把一条数据插入到数据库中去了,打印下沙盒路径也可以去查找到数据的存在。 2.插入多条数据 插入多条数据可以使用一个for循环进行插入,简单粗暴。

    for (int i = 0; i < 10; ++i) {// 1.创建对象Student *stu2 = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:_context];// 2.给属性赋值stu2.name = [NSString stringWithFormat:@"name%d",i];stu2.age = [NSNumber numberWithInteger:(arc4random() % 15 + 15)];stu2.sex = arc4random() % 2 == 0 ? @"男" : @"女";// 放到循环里的,执行的时候就一条一条的存入到数据库中//[_context save:nil];}// 3.保存数据库// 同时插入多条的数据时时运用的多线程,同时执行[_context save:nil];复制代码

从上面可以知道,数据的插入的会用到的方法为+ (__kindof NSManagedObject *)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context;。 所以对数据插入后调用的方法为:- (BOOL)save:(NSError **)error;,表示对数据库进行保存操作。

3.查询数据

1.创建查询对象

    // 1.创建查询对象// 参数:实体(相当于表名)NSFetchRequest *fetch_t = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
复制代码

这个name要和创建实体的名字一致。 2.直接查询

    // 1.直接查询(将表中所有的数据全部获取到)// 返回值:查询结果NSArray *array = [_context executeFetchRequest:fetch_t error:nil];// 遍历获取所有的对象for (Student *stu in array) {[stu show];}
复制代码

3.按条件进行查询 按条件进行查询可以使用谓词进行查询,谓词相当于就是一个查询的条件而已。

    // 1.创建条件对象// 参数:查询条件NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age < 18"];NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"age = 18 and sex = '男'"];// 条件:age的值不固定NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"age < %d",25];// 条件:值和属性都不固定(属性不固定,用K占位)NSPredicate *predicate4 = [NSPredicate predicateWithFormat:@"%K < %d", @"age", 30];// 2.给查询对象添加条件[fetch_t setPredicate:predicate4];// 3.查询结果NSArray *result = [_context executeFetchRequest:fetch_t error:nil];// 遍历获取的所有对象for (Student *stu2 in result) {[stu2 show];}
复制代码

4.查询结果排序

    // 1.创建一个排序对象// 参数1:排序的条件(按属性进行排序)// 参数2:是否升序NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];//2.设置查询对象的排序属性fetch_t.sortDescriptors = @[sort];// 3.查询结果NSArray *sortAscend = [_context executeFetchRequest:fetch_t error:nil];for (Student *stu4 in sortAscend) {[stu4 show];}
复制代码

到这里后上下文会引用一个方法就是- (nullable NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error;进行查询。 查询结果的显示是在Student这个类写了一个方法而已,

- (void)show {NSLog(@"%@ ~ %@ ~ %@",self.name, self.age, self.sex);
}
复制代码

4.删除数据

想要删除数据,那么首先要得找到这条数据,所以我们要的使用查询数据库的手段,所以我们就得按照条件进行查询数据。 1.数据的查询

    // 1.按条件将需要删除的数据查询出来NSFetchRequest *fetch_t = [NSFetchRequest fetchRequestWithEntityName:@"Student"];NSPredicate *pre = [NSPredicate predicateWithFormat:@"age < 25"];fetch_t.predicate = pre;NSArray *array = [_context executeFetchRequest:fetch_t error:nil];
复制代码

2.删除数据 按条件找到相应的数据了,就可以进行删除了。

    // 2.遍历查询结果,将结果中的对象删除for (Student *stu in array) {// 我觉得这个地方应该在判断下array到底有没有值,没有就直接返回,有值才去删除操作[_context deleteObject:stu];}
复制代码

上面得到删除数据的方法为:- (void)deleteObject:(NSManagedObject *)object;

5.更新数据

其实说到底更新数据和删除数据没有多大的差别,在实现上来说,都需要按条件找到相应的数据,只是删除的话是把数据删除了,而更新是要把数据附上一个新的值而已,最后将数据库进行保存。

// 1.按条件将需要删除的数据查询出来NSFetchRequest *fetch_t = [NSFetchRequest fetchRequestWithEntityName:@"Student"];NSPredicate *pre = [NSPredicate predicateWithFormat:@"age < 25"];fetch_t.predicate = pre;NSArray *array = [_context executeFetchRequest:fetch_t error:nil];// 2.遍历查询结果,将结果中的对象更新for (Student *stu in array) {stu.age = @20;}// 3.保存数据库[_context save:nil];
复制代码

coreData和sqlite3的比较

1.sqlite3是通过sql语句直接操作对象的属性;而coreData是直接对对象进行操作的。而两者都是直接或者间接对数据库文件进行操作的。 2.sqlite3使用的时候更加灵活,但是需要sql语句,这不能有一点的写错了,再加上Xcode对sql语句没有语法提示的。coreData不用sql语句编写就可以操作数据库的,但是对数据库的操作还是不够灵活(在runtime是不能使用coreData的,只能使用sqlite3或者是FMDB进行操作的)。 3.如果整个工程的数据结构比较简单的时候,尽量的去使用coreData进行数据本地化的处理。

iOS之coreData相关推荐

  1. ios技术篇-CoreData

    ios技术篇-CoreData 上一篇: iOS技术篇-CocoaPods       目录        下一篇:

  2. iOS开发 CoreData的简单使用

    CoreData介绍 CoreData是一门功能强大的数据持久化技术,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互.CoreData提供数据--OC对象映 ...

  3. iOS的CoreData技术笔记

    本文字数:5914字 预计阅读时间:28分钟 为什么写这篇文章 最近因为新项目想用到数据持久化,本来这是很简单的事情,复杂数据一般直接SQLite就可以解决了. 但是一直以来使用SQLite确实存在要 ...

  4. iOS: 转载CoreData数据库框架

    iphone-CoreData的使用详解 一.概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型 在M ...

  5. IOS CoreData 简单使用CURD

    2019独角兽企业重金招聘Python工程师标准>>> iOS在CoreData中简单封装了SQLite,让开发者不需要写sql语句就可以使用SQLite进行CURD操作. 要使用C ...

  6. iOS 16 中 CoreData 托管对象发生变化但其衍生 (Derived) 属性在 SwiftUI 中不刷新的解决

    引子 今天偶然发现 iOS 16 SwiftUI 开发中的一个问题. 具体情景为: 一个 SwiftUI + CoreData 的项目,使用 Xcode 14正式版开发.CoreData 数据库的 F ...

  7. 使用CoreData的轻量级自动数据迁移

    使用IOS的CoreData进行存储很方便,CoreData已经帮我们做了很多基础的工作,一般情况下没必要自己操作数据库了. 在开发中修改了实体模型,可能会遇到schema incompatibili ...

  8. 史上最全的iOS开源项目分类汇总

    学了这么久,还是抽时间把github上比较好用的第三方总结了一下: Category/Util sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错- BFKit 又一套Ca ...

  9. iOS-----GitHub上比较齐全的iOS 工具和App

    Github-iOS 工具 和 App 系统基础库 Category/Util  sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错-        BFKit 又一套Ca ...

最新文章

  1. 2020应届生:今年秋招也太太太太太难了吧!
  2. android x86 按键精灵,界面版按键精灵的使用【包含内置浏览器、打开程序的方法】...
  3. OpenCV形态学变换函数morphologyEx()黑帽运算的使用
  4. 常见Java面试题 抽象类能使用 final 修饰吗?
  5. 典型的Linux系统启动需要完成的服务
  6. 蚂蚁资深技术专家王旭:开源项目是如何让这个世界更安全的?
  7. CE3和UE3在多线程渲染方面的简单对比
  8. 20165203《Java程序设计》第四周学习总结
  9. 前途,路应该怎么走?
  10. MIT 6.824 学习笔记(一)--- RPC 详解
  11. C# mvc4.0 MD5测试
  12. Face3D学习笔记(6)3DMM示例源码解析【下】从二维图片的特征点重建三维模型
  13. 计算机系技能比赛黑板报,技能成就梦想黑板报图文
  14. 拯救不开心!我的机器人心理医生;机器学习的KPI千里追踪术;YOLO v7的PyTorch实现;李航新书『机器学习方法』开放试读 | ShowMeAI资讯日报
  15. c# 中文转换为拼音或者拼音首字母
  16. Kendo ui 使用总结----Kendo UI 模板
  17. 合理利用for循环遍历查找数据库数据
  18. Ftest(F检验)
  19. Centos6.7安装VNC及VNC客户端用来安装oracle11g
  20. 客户端连接不上mysql数据库_客户端无法连接数据库的小问题

热门文章

  1. Java Scanner 类
  2. CVPR14与图像视频检索相关的论文
  3. SIFT特征提取-应用篇
  4. Stanford UFLDL教程 栈式自编码算法
  5. 信息系统项目管理师-知识管理知识点
  6. 神奇的nginx之https支持
  7. Open ROADS Community首次正式会议在新加坡顺利召开
  8. 查看mysql库和表的大小(空间)
  9. 《大话设计模式》读书笔记-第8章 工厂方法模式
  10. Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法, 如何找回四舍五入法?...