CoreData使用

article/2025/8/19 20:23:17

一、CoreData的简单使用

1.什么是CoreData

  先认识一下这几个类

 (1)NSManagedObjectContext(被管理的数据上下文)

    作用:用来管理所有表的操作,对表的实体对应的数据库中的表的操作(插入,查询,修改,删除)


 (2)NSManagedObjectModel(被管理的数据模型,对应.momd文件)

    数据库所有表格或数据结构,包含各实体的定义信息

    作用:添加实体的属性,建立属性之间的关系

 

 (3)NSPersistentStoreCoordinator(数据库的连接器,持久化存储助理)

    作用:用来管理数据库的,可以设置数据存储的名字,位置,存储方式,和存储时机


 (4)NSManagedObject(被管理的数据记录)

    相当于数据库中的表格记录


 (5)NSFetchRequest(获取数据的请求)

    相当于查询语句


 (6)NSEntityDescription(实体结构对应单个表)

    相当于表结构


 (7)后缀为.xcdatamodeld的包CoreData的模型文件)

    数据模型编辑器编译后为.momd.mom文件

    作用:描述app中的所有实体和实体属性



2.CoreData的使用步骤

3.创建公司模型文件并创建员工实体Employee(name,age,height)

 

1)创建模型文件(相对于数据库)


2)创建实体文件(相对于表结构)



并添加相应字段



  • 3.创建实体类 相于模型类 (next选择模型文件,并关联表) 
 

  • 4.生成上下文 关联模型文件生成数据库  

  

    NSManagedObjectContext *ctx = [[NSManagedObjectContextalloc]init];

    //传一个nil,会把当前bundle的文件都关联起来

    NSManagedObjectModel *model = [NSManagedObjectModelmergedModelFromBundles:nil];

    

    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];

    

    NSString *sqlPath = [docstringByAppendingPathComponent:@"company.sqlite"];

    

    // 持久化存储调度器

    NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinatoralloc]initWithManagedObjectModel:model];

    

    ctx.persistentStoreCoordinator = store;

    

    NSError *error = nil;

    

    [store addPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:[NSURLfileURLWithPath:sqlPath]options:nilerror:&error];

    self.context = ctx;




5.保存员工数据

    //创建员工  通过表结构NSEntityDescription

    Employee *employ = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.context];

    //设置员工属性

    employ.name = @"王五";

    employ.age = @29;

    employ.height = @1.79;

    NSError *error = nil;

    [self.context save:&error];

    if (!error) {

        NSLog(@"插入成功");

    }



6.读取员工数据

  NSError *error = nil;

    NSArray *emps = [self.context executeFetchRequest:request error:&error];

    if (!error) {

        NSLog(@"emps: %@",emps);

        for (Employee *emp in emps) {

            NSLog(@"%@ %@ %@",emp.name,emp.age,emp.height);

        }

    }else{

        NSLog(@"%@",error);

    }

*> 读取张三的员工信息

1)直接遍历出所有对象进行查询

   // 修改数据必须要先把数据查询出来,然后再修改

    for (Person *p in emps) {

        

        //如果是“zhangsan”,则修改他的年龄为18

        if ( [p.name isEqualToString:@"zhangsan"] ) {

            p.age = [NSNumber numberWithInt:18];

        }

    }

    //保存。修改数据

    [self.managedObjectContext save:nil];

    2)创建请求体 过滤查询

  //创建一个请求对象 (填入要查询的表名-实体类)

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];

    

   // 过滤查询

   // 查找张三 并且身高大于1.8

        NSPredicate *pre = [NSPredicate predicateWithFormat:@"name=%@ AND height > %@",@"zhangsan",@(1.8)];

        request.predicate = pre;


*> 身高排序

 

  NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"height" ascending:YES];

        request.sortDescriptors = @[sort];




6.修改员工数据

*> 修改张三的身高

  // 1.查找员工

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];

    

    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name=%@",name];

    request.predicate = pre;

      

   

    NSArray *emps =[self.context executeFetchRequest:request error:nil];

   

    if (emps.count == 1) {

        Employee *emp = emps[0];

        emp.height = @1.7;

    }

    

    // 3.同步(保存)到数据

    [self.context save:nil];


7.删除员工数据

    // 删除zhangsan

    // 1.查找到zhangsan

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];

    

    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name=%@",name];

    request.predicate = pre;

    

    // 2.删除zhangsan

    NSArray *emps = [self.context executeFetchRequest:request error:nil];

    

    for (Employee *emp in emps) {

        NSLog(@"删除员工的人 %@",emp.name);

        [self.context deleteObject:emp];

    }

    

    // 3.context同步下数据库

    //所有的操作暂时都是在内存里,调用save 同步数据库

    [self.context save:nil];

8.模糊查询

 // 查询

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];

    

    // 过滤

    // 1.查询以wang开头员工

    //NSPredicate *pre = [NSPredicate predicateWithFormat:@"name BEGINSWITH %@",@"wang"];

    

    // 2.si 结尾

    //NSPredicate *pre = [NSPredicate predicateWithFormat:@"name ENDSWITH %@",@"si"];

    

    // 3.名字包含 g

    //    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name CONTAINS %@",@"g"];

    

    // 4.like si结尾

    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name like %@",@"li*"];

    request.predicate = pre;

    

    //读取信息

    NSError *error = nil;

    NSArray *emps = [self.context executeFetchRequest:request error:&error];

    if (!error) {

        NSLog(@"emps: %@",emps);

        for (Employee *emp in emps) {

            NSLog(@"%@ %@ %@",emp.name,emp.age,emp.height);

        }

    }else{

        NSLog(@"%@",error);

    }



二、高级查询

//c表示不区分大小写

// like '*jp'"   //jp结束

//@"name BEGINSWITH[cd] ''" //姓李的员工

//@"name ENDSWITH[c] ''"   //以梦结束的员工

//@"name CONTAINS[d] ''"   //包含有""字的员工

//分页fetchOffset fetchBatchSize

 // 分页查询 每页显示5条数据

    //第一页的数据

    request.fetchLimit = 5; //每页显示5条数据

    request.fetchOffset = 0;//起始数据


三、查找多表关联

1>添加部门表,查询属于某个部门的员工

创建部门实体文件,表结构(这里不截图了)记得和员工表格进行关联



 // 1.添加zhangsan 属于ios部门

    Employee *emp1 = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.context];

    emp1.name = @"zhangsan";

    emp1.height = @1.7;

    emp1.age = @27;


    // 创建ios部门

    Department *dep1 = [NSEntityDescription insertNewObjectForEntityForName:@"Department" inManagedObjectContext:self.context];

    dep1.name = @"ios";//部门

    dep1.createDate = [NSDate date];//部门创建时间

    dep1.departNo = @"D001";//部门编号

    

    

    emp1.depart = dep1;


 //查找ios部门的员工

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];

    

    // 过滤查询

    NSPredicate *pre = [NSPredicate predicateWithFormat:@"depart.name = %@",@"ios"];

    request.predicate = pre;


    

    

    //读取信息

    NSError *error = nil;

    NSArray *emps = [self.context executeFetchRequest:request error:&error];

    if (!error) {

        NSLog(@"emps: %@",emps);

        for (Employee *emp in emps) {

            NSLog(@"name:%@ departName:%@ ",emp.name,emp.depart.name);

        }

    }else{

        NSLog(@"%@",error);

    }


 备注:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取。




四、多个model文件,多个context;

在新建一个数据库实体文件,并关联实体类



// 1.上下文 关联Company.xcdatamodeld 模型文件

    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];

    

    // 关联模型文件

    

    // 创建一个模型对象

    // 查找model文件的URL

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:modelName withExtension:@"momd"];

//控制台 po[NSBundle mainBundle]可以查看到实体model后缀的类型文件

    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    

    // 持久化存储调度器

    NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

    

    // 存储数据库的名字

    NSError *error = nil;

    

    // 获取docment目录

    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    

    // 数据库保存的路径

    NSString *sqlitePath = [doc stringByAppendingFormat:@"/%@.slqite",modelName];

    

    [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:nil error:&error];

    

    context.persistentStoreCoordinator = store;

此时能够发现在沙盒目录下有两个数据库文件。


五、开打SQLITE开关

  • 1.打开Product,点击EditScheme...
  • 2.点击Arguments,在ArgumentsPassed On Launch中添加2项
  • 1> -com.apple.CoreData.SQLDebug
  • 2> 1
  • 生成对应的sql的语句如控制台。



六:简单终结

•sqlite CoreData 对比

 sqlite 是纯c语言存储数据方式

 coredata 也是对sqlite的封装 ,它数据的保存直接使用对象,不用再写sql语句

 sqlite 性能优于 coredata


什么时候使用sqlite 什么时候使用CoreData

 "Coredata功能不是很强大

 如果你的数据库表关联大复杂 三四张表都关联 -sqlite

 如果数据表结构比较简单 就只有两三张,这些表没有关联关系 coreData




http://chatgpt.dhexx.cn/article/ASXOKWeZ.shtml

相关文章

iOS CoreData的使用

CoreData是一个专门管理数据服务的框架,把OC对象和存储在SQLite文件中的数据进行互相转换,极大地方便了开发者在数据服务方面的开发。 1. 创建CoreData 在文件创建区下,选择【Core Data】下的【Data Model】 输入CoreData的文件名Model.x…

Core Data 概述

Core Data 概述 转载自: http://www.cocoachina.com/newbie/basic/2013/0911/6981.html Core Data可能是OS X和iOS里面最容易被误解的框架之一了,为了帮助大家理解,我们将快速的研究Core Data,让大家对它有一个初步的了解&#x…

CoreData相关01 基础及运用:添加、查询、过滤、排序、分页

CoreData CoreData中几乎不用写数据库操作语句就能完成数据的本地化存储。 CoreData和iOS中的模型对象相联系在一起,只需要操作模型对象的增删改查就可以完成数据的增删改查,不用写SQL语句。 CoreData的存储方式 SQLite NSSQLiteStoreType XML NSXML…

JVM原理分析

JVM原理分析 为什么Java是一种跨平台语言 1、不同系统的JDK下载 JDK里面有:Jre和Jvm,其中就有JVM指令集的不同 JVM主要结构: 栈、堆、方法区、程序计数器、本地方法栈 mian方法的执行 通过类装载子系统进入JVM 其中栈中存放线程 来一个…

JVM实现原理

JVM原理 1、概念简介2、为什么要学习JVM虚拟机?3、JVM怎么学?3.1 内存管理1、jvm运行时数据区 1、概念简介 JVM:JAVA虚拟机JRE:Java运行环境 JREJVM虚拟机Java核心类库支持文件JDK:Java开发工具包 JDKJREJava工具Java…

【JVM调优】JVM原理与性能调优

一、参考资料 今日头条https://www.toutiao.com/i7007696978586976805

JVM原理和调优的理解和学习

JVM原理和调优的理解和学习 一、详解JVM内存模型二、JVM中一次完整的GC流程是怎样的三、GC垃圾回收的算法有哪些四、简单说说你了解的类加载器五、双亲委派机制是什么,有什么好处,怎么打破六、说说你JVM调优的几种主要的JVM参数七、JVM调优八、类加载的机…

JVM原理-jvm内存模型

一、jvm内存模型 结构图 JVM包含两个子系统和两个组件 Class loader(类装载子系统) 根据给定的全限定名类名(如:java.lang.Object)来装载class文件到 Runtime data area运行时数据区中的method area方法区中Execution engine(执行引擎) 执行classes中的指令Runt…

JVM原理-垃圾回收机制及算法

JVM原理-jvm内存模型 jvm内存模型 一、垃圾回收机制算法 1、 判断对象是否回收算法 垃圾收集器在做垃圾回收的时候,首先需要判定的就是哪些内存是需要被回收的,哪些对象是存活的,是不可以被回收的;哪些对象已经死掉了&#xf…

jvm面试原理

1、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组…

JVM原理和JVM内存的整理

JVM原理及JVM内存 JVM原理及JVM内存概念这么说1.JVM的基本过程2.JVM的中的“解释”原理,三个重要机制3.JVM的体系结构4.运行时数据区JVM垃圾回收 JVM原理及JVM内存 之前看了许多JVM原理的文章、写作的大牛们都讲的很透彻,但是私下觉得:写得详…

JVM原理和调优(读这一篇就够了)

前言 抛2个问题: 1、export JAVA_OPTS"-Xms256m -Xmx512m -Xss256m -XX:PermSize512m -XX:MaxPermSize1024m -Djava.rmi.server.hostname136.64.45.24 -Dcom.sun.management.jmxremote.port9315 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.manageme…

JVM工作原理

JVM的生命周期 (1)两个概念:JVM实例和JVM执行引擎实例 JVM实例对应了一个独立运行的java程序,它是进程级别的 JVM执行引擎实例则对应了属于用户运行程序的线程,它是线程级别的 (2)VM实例的诞生…

JVM原理与实战

JVM原理 类加载流程和内存分配栈帧操作一、JVM垃圾回收算法主动加载的几种方式?符号引用和直接引用1.1 什么是垃圾(Garbage Collection)回收?1.2 引用计数法(Reference Conting)1.3 标记清除法 *(Mark - Sweep)1.4 复制算法 *(Copying)1.4.1 复制算法在JVM中的应用1.…

jvm原理与性能调优

文章目录 一、JVM内存结构 1.运行时数据区 2.直接内存 二、JVM中的对象 1.对象的创建 2.对象的内存布局 3.对象的访问定位 三、垃圾回收算法和垃圾回收器 1. 如何判断对象是已死 2.分代回收理论 3.垃圾回收算法 4.垃圾收集器 四、JVM执行子系统 1.Class文件结构 2.类加载机制 3…

什么是JVM?深入解析JVM原理!

一、JVM是什么? JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在J…

全面阐述JVM原理

一 JVM入门 1. 什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码…

JVM原理

JVM原理 一.jvm简介 JVM是Java Virual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,他是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组…

JVM原理详解

主题内容: 1.JVM 内存区域概览 2.堆区的空间分配是怎么样?堆溢出的演示 3.创建一个新对象内存是怎么分配的? 4.方法区 到 Metaspace 元空间 5.栈帧是什么?栈帧里有什么?怎么理解? 6.本地方法栈 7.程序…