别再被数据存储吓退!零基础玩转 iOS 的 Core Data
大家好,我是你们的老朋友小陈,一名在大厂干了三年 iOS 开发的工程师,业余时间也在 B 站做技术分享。最近收到不少刚入门的同学私信问我:“iOS 怎么存数据?UserDefaults 够用吗?Core Data 是不是很难?”
说实话,我当初学的时候也被 Core Data 吓到过——Xcode 自动生成一堆文件、NSManagedObject、Context、FetchRequest……听起来就像天书。但其实,它没那么可怕!只要理解几个核心概念,再动手写几行代码,你会发现:这玩意儿真香!
今天这篇文章,就是为完全零基础的朋友量身打造的 Core Data 入门教程。无论你是刚学 Swift 的小白,还是正在准备 iOS 求职面试的新手,这篇都能帮你打下扎实的基础。毕竟,在前端(没错,移动端也属于广义前端)开发中,数据持久化是绕不开的核心能力,也是面试官常问的考点。
为什么你需要学 Core Data?
在 iOS 开发中,我们经常需要把用户的数据“存下来”——比如待办事项、聊天记录、用户设置等。关掉 App 后再打开,数据还在,这就叫数据持久化。
常见的方案有:
UserDefaults:适合存少量简单数据(如开关状态、用户名)- 文件读写:适合存图片、JSON 等
- Core Data:苹果官方推荐的对象图管理 + 本地数据库方案,适合结构化数据(比如多个实体、有关系的数据)
💡 举个例子:你做一个“读书笔记”App,每本书有书名、作者、笔记内容,还能打标签。这种多字段、可能成百上千条的数据,就非常适合 Core Data。
而且,很多公司在招聘 iOS 工程师时,都会考察你是否了解 Core Data。掌握它,不仅提升开发效率,还能在求职中加分!
环境准备:5 分钟搞定开发环境
你只需要:
- 一台 Mac 电脑
- Xcode(建议最新稳定版,可在 App Store 免费下载)
第一步:创建新项目
- 打开 Xcode → “Create a new Xcode project”
- 选择 “App” → Next
- 填写 Product Name(比如
MyNotes) - 关键一步:勾选 ✅ Use Core Data
- 这会自动帮你配置好 Core Data 的基础代码和数据模型文件
- 语言选 Swift,Interface 选 SwiftUI(本文以 SwiftUI 为例,更现代简洁)
- 点击 “Create”
恭喜!你的项目已经内置了 Core Data 支持。
📌 小提示:如果你没勾选“Use Core Data”,后面也可以手动添加,但新手建议直接勾上,省去配置烦恼。
核心概念:用大白话讲清楚 Core Data
别被术语吓到,我用一个生活化的比喻来解释:
想象你开了一家“笔记本店”:
- Entity(实体) = 笔记本的“模板”,比如“读书笔记”这个类型,包含书名、作者、内容三个字段
- Attribute(属性) = 模板里的具体字段,比如“书名”是字符串,“阅读日期”是日期
- Managed Object(托管对象) = 一本具体的笔记本,比如《三体》的笔记
- Context(上下文) = 你的工作台。你要在工作台上写笔记、修改笔记,最后“保存”到仓库
- Persistent Store(持久化存储) = 仓库,通常是 SQLite 数据库文件(.sqlite),数据最终存在这里
简单说:你通过 Context 操作对象,最后保存到本地数据库。
实战:做个“待办事项”App
我们来做一个极简的 Todo App,支持添加和显示任务。全程只需几十行代码!
步骤 1:定义数据模型
在项目中找到 MyNotes.xcdatamodeld 文件(这就是数据模型文件),双击打开。
- 点击左下角 + 号,添加一个 Entity,命名为
Task - 在 Attributes 区域点击 +,添加两个属性:
title:类型选StringisCompleted:类型选Boolean
✅ 现在你有了一个 Task 模板!
⚠️ 注意:Entity 名和属性名首字母必须大写,这是 Core Data 的约定。
步骤 2:生成 Swift 类(可选但推荐)
Xcode 可以自动生成对应 Entity 的 Swift 类,方便我们操作。
- 选中
TaskEntity - 右侧 Inspector 面板 → Codegen 选择 Class Definition
- Clean & Build 项目(菜单栏 Product → Clean Build Folder,再 Build)
- Xcode 会自动生成
Task+CoreDataClass.swift和Task+CoreDataProperties.swift
现在你可以在代码里直接用 Task() 创建对象了!
步骤 3:在 SwiftUI 中使用 Core Data
打开 ContentView.swift,替换为以下代码:
import SwiftUI
import CoreData
struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Task.title, ascending: true)],
animation: .default
)
private var tasks: FetchedResults<Task>
@State private var newTaskTitle = ""
var body: some View {
NavigationView {
VStack {
// 输入框
HStack {
TextField("输入新任务", text: $newTaskTitle)
Button("添加") {
addTask()
}
}
.padding()
// 任务列表
List {
ForEach(tasks, id: \.self) { task in
Text(task.title ?? "无标题")
}
.onDelete(perform: deleteTasks)
}
}
.navigationTitle("我的待办")
}
}
private func addTask() {
withAnimation {
let newTask = Task(context: viewContext)
newTask.title = newTaskTitle
newTask.isCompleted = false
do {
try viewContext.save()
newTaskTitle = ""
} catch {
print("保存失败: \(error)")
}
}
}
private func deleteTasks(offsets: IndexSet) {
withAnimation {
offsets.map { tasks[$0] }.forEach(viewContext.delete)
do {
try viewContext.save()
} catch {
print("删除失败: \(error)")
}
}
}
}
代码逐行解释:
@Environment(\.managedObjectContext):获取当前视图的 Core Data 上下文(就是你的“工作台”)@FetchRequest:自动从数据库“拉取”所有 Task 对象,并按标题排序。数据一变,UI 自动更新!addTask():创建新 Task 对象 → 设置属性 → 调用viewContext.save()保存到数据库deleteTasks():从上下文中删除对象 → 再保存
🔥 重点:所有对数据的增删改,都要通过
viewContext.save()提交,否则不会真正写入数据库!
常见问题 & 避坑指南
Q1:为什么我保存了数据,重启 App 后没了?
原因:很可能你没调用 context.save(),或者保存时出错了但没处理。
解决:务必用 do-catch 包裹 save(),打印错误信息:
do {
try context.save()
} catch {
print("Core Data 保存失败: \(error.localizedDescription)")
}
Q2:如何查询特定数据?比如“只显示未完成的任务”
用 @FetchRequest 的 predicate 参数:
@FetchRequest(
entity: Task.entity(),
sortDescriptors: [],
predicate: NSPredicate(format: "isCompleted == false")
) var incompleteTasks: FetchedResults<Task>
Q3:Core Data 和 SQLite 什么关系?
Core Data 底层默认用 SQLite 存储,但你不用直接写 SQL!它是对象关系映射(ORM) 框架,你操作的是 Swift 对象,Core Data 自动转换成数据库操作。
| 方案 | 适合场景 | 学习成本 |
|---|---|---|
| UserDefaults | 少量简单配置 | ⭐ |
| 文件读写 | 图片、JSON、日志 | ⭐⭐ |
| Core Data | 结构化数据、关系型数据 | ⭐⭐⭐ |
| Realm / FMDB | 需要跨平台或高性能 | ⭐⭐⭐⭐ |
Q4:能直接看数据库内容吗?
可以!运行 App 后,在 Xcode 菜单栏:
- Window → Devices and Simulators
- 选中你的模拟器 → Installed Apps → 你的 App → Download Container
- 解压 .xcappdata 文件,在
Documents目录下找到.sqlite文件 - 用 DB Browser for SQLite 打开查看
给求职者的建议:Core Data 面试怎么答?
如果你在准备 iOS 求职,面试官可能会问:
“你们项目用什么做数据持久化?为什么选 Core Data?”
你可以这样回答:
肯定 Core Data 的优势:
“我们用 Core Data,因为它和 iOS 深度集成,支持自动内存管理、撤销操作、数据迁移,而且和 SwiftUI 的@FetchRequest配合得天衣无缝。”对比其他方案:
“对于简单配置我们用 UserDefaults;但像用户订单、聊天记录这种结构化数据,Core Data 更安全高效,避免手动解析 JSON 或拼 SQL。”提一下优化经验(加分项):
“我们还用了批量插入、后台 Context 避免卡主线程,以及预取关系减少 I/O。”
💬 记住:面试官不指望你精通,但希望你理解适用场景 + 有实战经验。
下一步学习路径
Core Data 入门后,你可以深入这些方向:
- 关系(Relationships):比如一个 User 有多个 Post
- 数据迁移(Migration):App 升级后,数据库结构变了怎么办?
- 性能优化:批量操作、分页加载、后台保存
- CloudKit 同步:让 Core Data 数据自动同步到 iCloud
我建议先动手做一个小项目(比如日记本、账本),把增删改查跑通。遇到问题就查 Apple 官方文档——虽然有点枯燥,但最权威。
最后说两句
我当初学 Core Data 时,也折腾了好几天才搞明白 Context 和 Save 的关系。但一旦打通任督二脉,你会发现它真的能极大提升开发效率。不要怕犯错,每个 bug 都是进步的阶梯。
如果你觉得这篇教程对你有帮助,欢迎去 B 站搜“iOS小陈”关注我,我会持续更新更多新手友好的实战教程。也欢迎在评论区留言你的问题,我会一一解答!
记住:前端不止 Web,移动端开发同样精彩。掌握 Core Data,是你迈向专业 iOS 工程师的重要一步。加油!

评论 0