10分钟上手Realm Swift:从0构建高效待办事项应用
你是否还在为iOS应用中的数据存储烦恼?Core Data配置复杂,SQLite语法繁琐,而Realm数据库(对象数据库,Object Database)提供了更简洁的解决方案。本文将带你从零开始,使用Realm Swift构建一个完整的待办事项应用,涵盖数据建模、CRUD操作、查询过滤和实时更新等核心功能,让你10分钟内掌握移动开发中的数据持久化最佳实践。
项目准备与环境配置
Realm Swift是专为iOS/macOS开发设计的移动端数据库,以其简洁的API和高性能著称。首先通过CocoaPods集成Realm到你的项目中,在Podfile中添加:
pod 'RealmSwift'
执行pod install后打开.xcworkspace文件。如需手动配置,可参考官方文档:examples/ios/swift/GettingStarted.playground/Contents.swift
数据模型设计:待办事项的核心结构
在Realm中,数据模型通过继承Object类实现。创建一个TodoItem模型,包含标题、完成状态、创建日期和优先级:
import RealmSwift
class TodoItem: Object {
@Persisted var title: String = "" // 待办标题
@Persisted var isCompleted: Bool = false // 完成状态
@Persisted var createdAt: Date = Date() // 创建时间
@Persisted var priority: Int = 0 // 优先级(0-2)
// 可选:设置主键
@Persisted(primaryKey: true) var id: ObjectId = ObjectId()
}
@Persisted属性包装器标记需要持久化的属性,支持多种数据类型:String、Bool、Date等基础类型,以及List、ObjectId等Realm特有类型RealmSwift/Object.swiftObjectId是Realm提供的自动生成唯一标识符,适合作为主键RealmSwift/ObjectId.swift
数据库操作:实现待办事项的增删改查
初始化Realm实例
获取默认Realm实例(存储在应用沙盒中):
import RealmSwift
// 获取默认配置的Realm
let realm = try! Realm()
// 查看数据库文件路径(调试用)
print("Realm文件路径: \(realm.configuration.fileURL!)")
添加待办事项
// 创建新待办
let newTodo = TodoItem()
newTodo.title = "学习Realm数据库"
newTodo.priority = 1
// 写入数据库
do {
try realm.write {
realm.add(newTodo)
}
} catch {
print("添加失败: \(error)")
}
Realm的写操作需要在write事务中执行,确保数据一致性[RealmSwift/Realm.swift#L219-L220]
查询待办事项
// 获取所有待办
let allTodos = realm.objects(TodoItem.self)
// 按创建时间排序(降序)
let sortedTodos = allTodos.sorted(byKeyPath: "createdAt", ascending: false)
// 过滤未完成的高优先级事项
let highPriorityTodos = sortedTodos.filter("isCompleted == false AND priority == 2")
// 实时更新的结果集
highPriorityTodos.observe { changes in
switch changes {
case .initial:
// 初始数据加载完成
break
case .update(_, let deletions, let insertions, let modifications):
// 数据发生变化,更新UI
print("删除: \(deletions), 插入: \(insertions), 修改: \(modifications)")
case .error(let error):
print("观察错误: \(error)")
}
}
Realm的查询结果Results是实时更新的,当数据库变化时会自动刷新RealmSwift/Results.swift
更新待办状态
// 假设已获取某个待办事项
if let firstTodo = allTodos.first {
do {
try realm.write {
firstTodo.isCompleted = true // 直接修改属性
}
} catch {
print("更新失败: \(error)")
}
}
删除待办事项
if let todoToDelete = allTodos.filter("title CONTAINS '过时'").first {
do {
try realm.write {
realm.delete(todoToDelete)
}
} catch {
print("删除失败: \(error)")
}
}
高级功能:使用List实现分类管理
创建TodoList模型管理多个待办事项,使用List建立一对多关系:
class TodoList: Object {
@Persisted var name: String = ""
@Persisted var items: List<TodoItem> = List<TodoItem>() // 待办事项列表
@Persisted var createdAt: Date = Date()
@Persisted(primaryKey: true) var id: ObjectId = ObjectId()
}
// 使用示例
let workList = TodoList()
workList.name = "工作任务"
// 添加待办到列表
try! realm.write {
workList.items.append(newTodo) // 将前面创建的newTodo添加到列表
realm.add(workList)
}
List是Realm提供的有序集合类型,类似Swift的Array但支持实时更新RealmSwift/List.swift
实际案例:构建待办事项应用界面
结合UIKit实现简单的待办列表界面,使用UITableViewController展示Realm查询结果:
import UIKit
import RealmSwift
class TodoListViewController: UITableViewController {
private let realm = try! Realm()
private var todos: Results<TodoItem>!
private var notificationToken: NotificationToken?
override func viewDidLoad() {
super.viewDidLoad()
// 查询数据并排序
todos = realm.objects(TodoItem.self).sorted(byKeyPath: "createdAt", ascending: false)
// 监听数据变化
notificationToken = todos.observe { [weak self] _ in
self?.tableView.reloadData()
}
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return todos?.count ?? 0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TodoCell", for: indexPath)
let todo = todos[indexPath.row]
cell.textLabel?.text = todo.title
cell.accessoryType = todo.isCompleted ? .checkmark : .none
// 根据优先级设置颜色
switch todo.priority {
case 2: cell.textLabel?.textColor = .red
case 1: cell.textLabel?.textColor = .orange
default: cell.textLabel?.textColor = .black
}
return cell
}
// 点击单元格切换完成状态
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let todo = todos[indexPath.row]
try! realm.write {
todo.isCompleted.toggle()
}
tableView.deselectRow(at: indexPath, animated: true)
}
}
性能优化与最佳实践
- 批量操作:多个写操作合并到一个事务中,减少I/O开销
try! realm.write {
// 批量添加
for title in ["买牛奶", "取快递", "预约医生"] {
let todo = TodoItem()
todo.title = title
realm.add(todo)
}
}
- 后台线程处理:复杂查询或大量数据操作放在后台线程执行
DispatchQueue.global().async {
autoreleasepool {
let backgroundRealm = try! Realm()
let highPriority = backgroundRealm.objects(TodoItem.self).filter("priority == 2")
// 处理数据...
DispatchQueue.main.async {
// 更新UI
}
}
}
- 索引优化:为频繁查询的字段添加索引
class TodoItem: Object {
@Persisted var title: String = ""
@Persisted(indexed: true) var priority: Int = 0 // 添加索引
}
- 数据迁移:应用更新时处理模型变化,参考examples/ios/swift/Migration
总结与扩展
通过本文,你已掌握使用Realm Swift构建待办事项应用的核心技能:
- 设计数据模型与使用
@Persisted属性 - 执行CRUD操作与事务管理
- 使用
Results和List进行查询和关系管理 - 实现实时数据更新与UI同步
Realm还提供更多高级功能:
- 数据加密保护敏感信息examples/ios/swift/Encryption
- 与SwiftUI集成examples/ios/swift/ListSwiftUI
- 云同步功能(需要MongoDB Atlas账号)
现在就动手改造这个基础版本,添加分类管理、提醒功能或统计报表,打造属于你的高效待办应用吧!完整示例代码可参考Realm官方示例库中的Simple和TableView项目。
如果你觉得本文有帮助,请点赞收藏,并关注获取更多Realm进阶技巧!下一期我们将探讨Realm的高级查询和性能调优策略。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



