【iOS】Core Data
【iOS】Core Data前言Core Data基本概念Core Data核心组件Core Data增删改查总结前言笔者写项目时用到了Core Data在此系统学习总结一下。Core Data基本概念Core Data是Apple官方推出适配iOS/macOS的本地数据持久化与对象图管理框架并非数据库而是封装了SQLite、二进制、XML存储的ORM框架。开发者无需编写SQL语句可直接通过操作OC对象实现数据增删改查同时内置缓存、事务、撤销重做、数据版本迁移能力。其优势主要在于简化数据管理提供ORM映射自动完成OC对象与数据库数据的转换减少了直接与SQL数据库的交互。高效数据查询通过NSPredicate进行复杂的数据查询提高数据检索的灵活性和效率。内置缓存机制上下文自动缓存已加载数据减少频繁磁盘IO提升数据读写性能。版本控制自动处理数据模型的版本管理支持数据迁移。Core Data采用分层栈架构所有数据操作遵循Model-Context-Coordinator-持久化文件的流转逻辑。其核心组件包括NSManagedObjectModel数据模型等同于数据库Schema定义Entity数据表、Attribute字段、Relationship表关联是整个数据体系的结构基础。Schema数据库中表、视图、索引、存储过程等数据库对象的集合相当于数据库内部的命名空间。NSManagedObjectContext托管上下文/MOC数据操作的核心工作区负责追踪数据变更、管理托管对象生命周期、执行数据的增删改查、提交保存事务。NSPersistentStoreCoordinator持久化协调器/PSC中间调度层衔接上下文与底层存储屏蔽不同存储类型SQLite/二进制/XML的差异开发者无需直接操作。NSManagedObject托管对象数据实体实例对应数据库中的单条数据记录通过KVC完成字段赋值与取值。NSPersistentContaineriOS10推出的整合容器一键封装核心组件简化Core Data初始化配置。Core Data核心组件NSManagedObjectModel数据模型对应数据库Schema无任何业务逻辑只负责定义数据结构与关联关系。模型的核心结构有Entity实体。对应数据库数据表。Attribute属性、字段。实体的具体字段支持各种数据类型。Relationship关联关系。实体与实体之间的关联支持一对一、一对多、多对多对应数据库外键关联。Fetched Property查询属性。预定义查询规则无需重复写查询条件提升复用性。数据模型有两种创建方式.xcdatamodeld文件Xcode手动创建Data Model文件编译后自动生成.momd文件代码读取该文件加载模型。纯代码动态构建适合解决多人协作git文件合并出现冲突问题。我自己和别人协作的MemoryCity的项目里就使用了纯代码构建的方式这样不依赖NSManagedObject子类不生成任何托管对象子类后续所有读写操作数据统一使用KVC。-(NSManagedObjectModel*)managedObjectModel{// 初始化模型对象NSManagedObjectModel*model[[NSManagedObjectModel alloc]init];// 初始化Entity实体NSEntityDescription*cachedPostEntity[[NSEntityDescription alloc]init];cachedPostEntity.namekYALCachedPostEntityName;cachedPostEntity.managedObjectClassNameNSManagedObject;// 创建Attribute字段NSMutableArrayNSAttributeDescription**attributes[NSMutableArray array];[attributes addObject:[selfstringAttributeWithName:cacheScope]];// ...添加多个属性// 绑定字段到实体cachedPostEntity.propertiesattributes;// 将实体加入模型model.entities[cachedPostEntity];returnmodel;}NSManagedObjectContextMOC是Core Data中管理托管对象生命周期和数据库持久化的核心组件。所有数据的增删改查都必须依托上下文完成即内存中的数据草稿区。数据变更现在内存中生效调用save:后才真正持久化到磁盘。MOC核心特性事务支持MOC支持事务操作可以确保数据的一致性和完整性开发者可以使用它执行批量的数据插入、更新等操作。缓存机制 MOC提供了一个内存中的对象缓存所有对数据的操作首先在缓存中进行这样可以避免频繁的磁盘I/O操作提升性能。变更追踪 MOC能够追踪对数据模型所做的更改并管理相关对象的生命周期这简化了数据同步和更新的过程。非线程安全内部无同步锁保护严禁跨线程操作多线程需单独创建子上下文。获取主线程上下文示例interfaceSceneDelegate()endimplementationSceneDelegatesynthesizepersistentContainer_persistentContainer;-(NSPersistentContainer*)persistentContainer{if(_persistentContainernil){// 创建Core Data容器并加载数据模型ModelName为.xcdatamodeld文件名字// iOS10后NSPersistentContainer内部帮我们创建好model、PSC、MOC_persistentContainer[[NSPersistentContainer alloc]initWithName:ModelName];// 打开数据库loadPersistentStores内部为我们完成了// 1. 找SQLite文件没有就创建并打开// 2. 创建Persistent Store持久化仓库连接起来PSC// 3. 建立映射将定义的Entity存储类型为SQLiteCore Data将每个Entity自动映射为一张Table数据表所有SQL语句在由Core Data在内部自动生成持计划仓库读写这份SQLite文件// 4. 完成后回调p1表示当前加载的Store描述如SQLite文件位置、是否只读等等 p2表示是否加载打开数据库失败[_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription*storeDescription,NSError*error){if(error!nil){}}];// 自动合并父子上下文变更_persistentContainer.viewContext.automaticallyMergesChangesFromParentYES;}return_persistentContainer;}这里主要通过NSPersistentContainer获取第一次访问创建并加载第二次访问直接返回类似懒加载模式。其中viewContext在主线程主要用于界面相关的数据读取和更新。设置automaticallyMergesChangesFromParent为YES的意义在于当后台MOC保存数据后主线程viewContext可以自动合并这些改动避免界面显示旧数据可同步前后台上下文数据。NSPersistentStoreCoordinatorPSC是Core Data底层调度核心负责衔接上下文与本地持久化文件屏蔽掉SQLite、二进制和内存等不同存储类型的差异。其支持的存储类型有NSSQLiteStoreType默认存储最常用。基于SQLite数据库支持负责查询和事务。NSBinaryStoreType二进制文件存储适合轻量数据。读写速度快但不支持复杂查询。NSInMemoryStoreType内存存储适合临时缓存数据。数据断电会丢失。NSXMLStoreTypeXML文件存储。仅macOS支持iOS已废弃。一般情况下无需手动调用容器和上下文会自动封装。上面获取主线程上下文的demo里就是通过NSPersistentContainer已经封装好的示例。手动配置demo整个过程其实就是先创建好模型然后关联给PSC再创建并添加给PSC数据库最终达到Model、PSC和SQLite关联起来的效果。// 创建模型NSManagedObjectModel*model[selfmanagedObjectModel];// 用模型创建PSCNSPersistentStoreCoordinator*coordinator[[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:model];// 获取数据库存储路径NSURL*storeURL[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].lastObject;storeURL[storeURL URLByAppendingPathComponent:CoreDataDemo.sqlite];// 创建数据库配置// p1是否允许自动迁移数据YES表示Core Data会尝试自动升级数据库 p2是否自动推断MappingModelYES表示Core Data会自己从旧字段生成为新字段NSDictionary*options{NSMigratePersistentStoresAutomaticallyOption:YES,NSInferMappingModelAutomaticallyOption:YES};NSError*errornil;// 给PSC添加数据库if(![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:error]){NSLog(PSC配置失败%,error.localizedDescription);}NSManagedObjectNSManagedObject是数据实体的运行实例对应数据库里单条数据记录所有操作使用KVC。常用APIvalueForKey:获取字段值setValue:forKey:设置字段值objectID获取数据唯一标识可用于精准查询entity获取当前关联的实体描述Core Data增删改查新增数据核心步骤为获取MOC通过insertNewObjectForEntityForName:inManagedObjectContext:创建实体对象并使用KVC赋值最后调用save:持久化数据。-(void)insertCoreData{NSManagedObjectContext*context[selfcreateContext];// 创建实体对象NSManagedObject*student[NSEntityDescription insertNewObjectForEntityForName:StudentinManagedObjectContext:context];// 赋值[student setValue:lydforKey:name];[student setValue:19forKey:age];// 保存数据NSError*errornil;if([context save:error]){NSLog(新增数据成功);}else{NSLog(新增数据失败%,error.localizedDescription);}}这里会遇到一个问题大量数据在主线程进行新增保存操作会使得使得主线程堵塞卡顿。我们使用后台Context在子线程新增保存最后同步到主线程来解决。NSManagedObjectContext*context[[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];NSManagedObjectContextConcurrencyType枚举值NSMainQueueConcurrencyType主线程上下文。创建后绑定主线程必须在主线程操作。NSPrivateQueueConcurrencyType私有队列上下文。拥有独立串行队列所有操作必须使用performBlock:或performBlockAndWait:。Core Data是线程不安全的Core Data要求所有操作必须跑在MOC自己的队列里GCD队列无法和Core Data内部事务时序对齐。因此这里必须使用performBlock:或performBlockAndWait:。performBlock:异步。不阻塞当前线程适合后台批量写入和异步查询。performBlockAndWait:同步。阻塞调用方等数据库操作完成后返回。无论异步或者同步其本质都是把block提交给上下文自身持有的串行队列执行。查询数据主要基于NSFetchRequest实现支持条件查询、排序和分页。-(NSArray*)fetchAllStudent{NSManagedObjectContext*context[selfmainContext];// 创建查询请求指定实体NSFetchRequest*request[[NSFetchRequest alloc]initWithEntityName:Student];// 条件request.predicate[NSPredicate predicateWithFormat:age %d,age];// 升序request.sortDescriptors[[NSSortDescriptor sortDescriptorWithKey:ageascending:YES]];// 分页request.fetchLimit20;request.fetchOffset0;NSError*errornil;NSArray*resultArray[context executeFetchRequest:request error:error];if(error){NSLog(查询失败%,error.localizedDescription);returnnil;}returnresultArray;}更新数据核心逻辑为先查询、再修改、最后保存修改内存中托管对象属性保存后同步到磁盘。-(void)updateStudentData{NSManagedObjectContext*context[selfmainContext];NSFetchRequest*request[[NSFetchRequest alloc]initWithEntityName:Student];// NSPredicate谓词用来定义过滤条件NSPredicate*predicate[NSPredicate predicateWithFormat:name %,lyd];request.predicatepredicate;NSError*errornil;NSArray*result[context executeFetchRequest:request error:error];// 修改匹配到的第一条数据if(result.count0){NSManagedObject*studentresult.firstObject;[student setValue:20forKey:age];// 保存更新[context save:error];NSLog(数据更新成功);}}删除数据-(void)deleteStudentData{NSManagedObjectContext*context[selfmainContext];NSFetchRequest*request[[NSFetchRequest alloc]initWithEntityName:Student];NSPredicate*predicate[NSPredicate predicateWithFormat:age %d,20];request.predicatepredicate;NSError*errornil;NSArray*result[context executeFetchRequest:request error:error];if(result.count0){[context deleteObject:result.firstObject];[context save:error];NSLog(数据删除成功);}}总结

相关新闻

iOS 企业开发者账号到期续费完整流程与避坑指南

iOS 企业开发者账号到期续费完整流程与避坑指南

一、什么是 Apple Enterprise 企业开发者账号 苹果企业开发者计划(Apple Developer Enterprise Program)面向正规注册企业开放,年费 299 美元,核心作用是企业内部自研 App 无需上架 App Store,直接分发给内部员工安装…

2026/7/18 21:14:36阅读更多 →
多模式、自动化、精度:三维光学轮廓仪选型的三个关键看什么?

多模式、自动化、精度:三维光学轮廓仪选型的三个关键看什么?

一、直接回答:三款国产三维光学轮廓仪,差异不在于“谁更好”,而在于“匹配什么场景”当用户点名询问托托科技、中图仪器、优可测三个品牌时,通常期望得到一个“谁性能更强”的简单结论。然而,在当前国产精密光学仪器市…

2026/7/18 21:12:35阅读更多 →
10分钟打造专属AI音色:RVC变声器完整指南与实战解析

10分钟打造专属AI音色:RVC变声器完整指南与实战解析

10分钟打造专属AI音色&#xff1a;RVC变声器完整指南与实战解析 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversio…

2026/7/18 21:12:35阅读更多 →
方案被覆盖、合同找不到旧版,企业文件系统为什么需要版本历史

方案被覆盖、合同找不到旧版,企业文件系统为什么需要版本历史

方案被覆盖、合同找不到旧版&#xff0c;企业文件系统为什么需要版本历史 企业文件管理里&#xff0c;误删很容易被重视&#xff0c;误覆盖却经常被忽略。 文件被删除了&#xff0c;大家会想到回收站&#xff1b;文件被覆盖了&#xff0c;很多人直到需要旧版时才发现&#xf…

2026/7/18 22:24:52阅读更多 →
确认流程要问清什么,欧派立方体床垫怎么选才稳

确认流程要问清什么,欧派立方体床垫怎么选才稳

半夜翻身时身体容易陷住&#xff0c;早上起床腰背发僵&#xff0c;很多人第一反应是换一张更硬的床垫。其实&#xff0c;腰酸背痛人群选床垫&#xff0c;重点不是“越硬越好”&#xff0c;而是看软硬度和支撑能不能同时成立。床垫太硬&#xff0c;肩、腰、胯等位置可能贴合不足…

2026/7/18 22:24:52阅读更多 →
文献综述怎么写?2026年AI辅助写作实测,3天搞定3000字高质量综述

文献综述怎么写?2026年AI辅助写作实测,3天搞定3000字高质量综述

【一句话答案】文献综述的核心难点是"读不完的文献和理不清的脉络"&#xff0c;毕业之家AI&#xff08;www.biye.com&#xff09;的ai创作文献综述功能基于真实文献检索生成综述框架&#xff0c;实测3天即可完成一篇导师认可的3000字综述。一、现状&#xff1a;文献综…

2026/7/18 22:24:52阅读更多 →
AI开题报告怎么写才能一次通过?2026年5分钟生成攻略+导师最看重的3个点

AI开题报告怎么写才能一次通过?2026年5分钟生成攻略+导师最看重的3个点

【一句话答案】用对工具&#xff0c;开题报告完全可以一次通过&#xff1a;毕业之家AI&#xff08;www.biye.com&#xff09;的ai生成开题报告功能基于真实文献检索生成研究框架&#xff0c;逻辑完整、格式规范&#xff0c;实测导师一次通过率显著高于通用AI工具。一、现状&…

2026/7/18 22:24:52阅读更多 →
【计算机毕业设计】农产品销售系统设计与实现

【计算机毕业设计】农产品销售系统设计与实现

1.系统介绍随着乡村振兴战略的推进和农产品电商的快速发展&#xff0c;传统线下农产品销售模式已难以满足消费者便捷购物、商家高效运营的需求&#xff0c;信息不对称、交易流程繁琐、管理效率低等问题凸显&#xff0c;开发一套数字化、一体化的农产品销售系统成为行业发展的迫…

2026/7/18 22:24:52阅读更多 →
[Android] 探慧家 v1.1.14-智能设备管理工具

[Android] 探慧家 v1.1.14-智能设备管理工具

[Android] 探慧家 v1.1.14-智能设备管理工具 链接&#xff1a;https://pan.xunlei.com/s/VOxo89dHVyhgxNyurk_pePoJA1?pwds7sq# 一个智能设备管理工具&#xff0c;通过APP可以遥控家中的智能硬件设备&#xff0c;支持使用智能联动、家庭管理、设备分享等功能服务&#xff…

2026/7/18 22:22:52阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比&#xff1a;全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时&#xff0c;第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/18 10:49:13阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件&#xff1a;5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/18 8:49:08阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL&#xff1a;跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/18 14:49:24阅读更多 →
从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;从模糊意图到可执行指令&#xff1a;Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档&#xff08;PRD&#xff09;生成实践中&#xff0c;原始业务意图往往以自然语言片…

2026/7/18 0:00:14阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Cursor配置生成失效&#xff1f;3大隐藏陷阱4行修复代码&#xff0c;资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效&#xff0c;是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:14阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者&#xff1a;钟声编辑&#xff1a;Mark出品&#xff1a;红色星际头图&#xff1a;智能驾驶图片据悉&#xff0c;国内某头部智驾公司端到端模型技术大牛Z投身创业&#xff0c;并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈&#xff0c;更是业内…

2026/7/18 0:00:14阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/17 22:48:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →