iOS CoreData的使用

article/2025/8/19 20:20:55

CoreData是一个专门管理数据服务的框架,把OC对象和存储在SQLite文件中的数据进行互相转换,极大地方便了开发者在数据服务方面的开发。

1. 创建CoreData

在文件创建区下,选择【Core Data】下的【Data Model】
在这里插入图片描述

输入CoreData的文件名Model.xcdatamodel
在这里插入图片描述

Model.xcdatamodeld文件默认是Swift的,如果想要改成oc,可以在打开Model.xcdatamodeld文件,在右侧工具栏中修改。
在这里插入图片描述

2. 创建Entity

CoreData文件下面有个【Add Entity】的按钮,点击它就创建了一个空表。
可以在Entity里面添加AttributesRelationshipsFetched Properties,分别是属性、关联关系以及获取操作。
在这里插入图片描述

属性类型

类型说明
Integer 16整数,范围是-32768 ~ 32767
Integer 32整数,范围是-2147483648 ~ 2147483647
Integer 64整数,范围是–9223372036854775808 ~ 9223372036854775807
Decimal数值,用NSDecimalNumber表示
Double双精度浮点数
Float浮点数
String字符串,用NSString表示
Boolean代表布尔值
Date日期时期
Binary Data二进制,用NSData表示
URIURL对象,用NSURL表示
TransformableObjective对象,要遵守NSCoding协议

关联关系的Inverse属性表示是否可以从一个实体中找到另一个实体,这样使两个实体具有双向的关联关系。

【Editor Style】按钮可以看出实体和属性的关系,以及可以看出实体之间的对应的关系。
在这里插入图片描述

3. 生成模型文件

选择【Editor】菜单下的【Create NSManagedObject Subclass…】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最终生成StudentModelTeacherModel文件
在这里插入图片描述

StudentModel+CoreDataClass文件里面StudentModel继承了NSManagedObject

@class TeacherModel;@interface StudentModel : NSManagedObject
@end

StudentModel+CoreDataProperties文件

@interface StudentModel (CoreDataProperties)+ (NSFetchRequest<StudentModel *> *)fetchRequest;@property (nonatomic) int32_t age;
@property (nullable, nonatomic, copy) NSString *name;
@property (nullable, nonatomic, retain) TeacherModel *teacher;@end@implementation StudentModel (CoreDataProperties)+ (NSFetchRequest<StudentModel *> *)fetchRequest {return [NSFetchRequest fetchRequestWithEntityName:@"StudentModel"];
}@dynamic age;
@dynamic name;
@dynamic teacher;@end

4. CoreData核心类

类名说明
NSPersistentStoreCoordinator数据库的连接器,设置数据存储的名字,位置,存储方式等
NSManagedObjectContext负责应用与数据库之间的交互,增删改查基本操作都要用到
NSManagedObjectModel被管理的数据模型,可以添加实体及实体的属性,为xxx.xcdatamodeld文件
NSManagedObject从CoreData中取出来的对象,默认都是NSManagedObject对象,通过键值对来存取所有的实体属性,相当于数据库中的表格记录
NSFetchRequest获取数据时的请求

一般都在AppDelegate中创建,以便在各处使用

@property(nonatomic, strong) NSManagedObjectModel *managedObjectModel;
@property(nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;- (NSManagedObjectModel *)managedObjectModel {if (!_managedObjectModel) {// 创建数据模型文件,类型为momdNSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];}return _managedObjectModel;
}- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {if (!_persistentStoreCoordinator) {// 创建数据库连接器_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];// 关联相关的sqlite文件,如果没有则创建一个新的NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true).lastObject;NSURL *sqliteUrl = [NSURL URLWithString:[docPath stringByAppendingPathComponent:@"blog.sqlite"]];[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqliteUrl options:nil error:nil];}return _persistentStoreCoordinator;
}- (NSManagedObjectContext *)managedObjectContext {if (!_managedObjectContext) {// 创建上下文对象,ConcurrencyType主要有NSPrivateQueueConcurrencyType和NSMainQueueConcurrencyType// NSPrivateQueueConcurrencyType表示私有并发队列的类型,操作也是在子线程中完成// NSMainQueueConcurrencyType表示主并发队列类型,在UI上的操作,使用这个参数初始化_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];// 关联数据库连接器_managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator;}return _managedObjectContext;
}- (void)saveContext {NSError *error = nil;if ([self.managedObjectContext hasChanges] && ![self.managedObjectContext save:&error]) {NSLog(@"saveContext error = %@", error.userInfo);}
}

5. 数据操作

查找操作,NSFetchRequest查询特定实体,NSPredicate限制查询条件,。

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"StudentModel"];if (name.length > 0) {NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", name];request.predicate = predicate;
}NSArray *data = [self.managedObjectContext executeFetchRequest:request error:nil];

插入操作,通过NSEntityDescriptioninsert进行插入操作,添加到数据库中

StudentModel *student = [NSEntityDescription insertNewObjectForEntityForName:@"StudentModel"inManagedObjectContext:self.managedObjectContext];
student.name = self.nameTextField.text;
student.age = [self.ageTextField.text intValue];[self saveContext];

编辑操作,需要先查询需要删除的托管对象,self.currentModel是上面查询到的某条数据

self.currentModel.name = self.nameTextField.text;
self.currentModel.age = [self.ageTextField.text intValue];[self saveContext];

删除操作,同编辑操作,也需先查询托管对象

[self.managedObjectContext deleteObject:self.currentModel];[self saveContext];

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

相关文章

Core Data 概述

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

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

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

JVM原理分析

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

JVM实现原理

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

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

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

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

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

JVM原理-jvm内存模型

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

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

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

jvm面试原理

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

JVM原理和JVM内存的整理

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

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

前言 抛2个问题&#xff1a; 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的生命周期 &#xff08;1&#xff09;两个概念&#xff1a;JVM实例和JVM执行引擎实例 JVM实例对应了一个独立运行的java程序&#xff0c;它是进程级别的 JVM执行引擎实例则对应了属于用户运行程序的线程&#xff0c;它是线程级别的 &#xff08;2&#xff09;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&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码…

JVM原理

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

JVM原理详解

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

JVM的运行原理

目录 1.概念 2.JVM运行机制 3.JVM执行流程 4.JVM运行时数据区 什么是线程私有? OOM&#xff08;内存溢出&#xff09; 4.1 堆&#xff1a;也叫运行时数据区&#xff0c;线程共享 4.2 方法区&#xff1a;线程共享 4.3 Java虚拟机栈&#xff1a;线程私有&#xff0c;描…