Swift(iOS/macOS)的ORM:比较与示例
在开发iOS和macOS应用时,本地数据处理是核心任务之一。对象关系映射(ORM)允许开发者使用面向对象的方式操作数据库,而无需编写原始SQL查询。本文将介绍四种主要的Swift ORM解决方案:Core Data、Realm、GRDB和SwiftData。您将了解它们的优缺点,并看到每种技术的代码示例。
1. Core Data
Core Data是苹果公司提供的框架,内置于iOS、macOS、tvOS和watchOS中。它并非纯粹的ORM(更准确地说是一个持久化框架),但具备ORM的所有功能:管理对象模型、数据持久化、变更回滚,以及通过NSFetchedResultsController与UI绑定。
优势:
- 与苹果生态系统深度集成(iCloud、SwiftUI、Combine)
- 内置版本控制和数据迁移支持
- 强大的谓词和排序功能
缺点:
- 配置复杂,包含大量样板代码
- 多线程问题(需要严格的上下文管理)
- 处理大量数据时性能较低
使用示例:
import CoreData
// 1. 创建模型(在Xcode Data Model Editor中)// 2. 初始化容器let container = NSPersistentContainer(name: "MyModel")container.loadPersistentStores { _, error in if let error = error { fatalError("加载失败: \\(error)") }}
// 3. 保存对象let context = container.viewContextlet user = User(context: context)user.name = "伊万"user.age = 30try? context.save()
// 4. 查询let request: NSFetchRequest<User> = User.fetchRequest()request.predicate = NSPredicate(format: "age > %@", 18)let adults = try? context.fetch(request)2. Realm
Realm是一款流行的第三方ORM,专为移动平台设计。在大多数场景下,它比Core Data运行更快且更易用。Realm使用自有的存储引擎,而非SQLite。
优势:
- 读写速度高
- API简洁(无需NSManagedObject)
- 内置响应式更新支持(通过Realm Notifications)
缺点:
- 闭源代码(并非完全开源)
- 模型变更时迁移困难
- 对复杂查询支持有限(JOIN、子查询)
使用示例:
import RealmSwift
// 1. 定义模型class User: Object { @Persisted var name: String = "" @Persisted var age: Int = 0}
// 2. 创建并保存let realm = try! Realm()let user = User()user.name = "玛丽亚"user.age = 25try! realm.write { realm.add(user)}
// 3. 查询let adults = realm.objects(User.self).filter("age > 18")3. GRDB
GRDB是一款轻量级Swift ORM,基于SQLite构建。它让开发者完全掌控SQL查询,同时提供便捷的面向对象接口。GRDB尤其受到那些希望结合SQL强大功能与Swift便利性的开发者青睐。
优势:
- 完全访问SQL(可编写复杂查询)
- 高性能(接近原生SQLite)
- 支持Swift并发(async/await)
缺点:
- 需要掌握SQL知识
- 文档比Core Data少
- 无内置iCloud支持
使用示例:
import GRDB
// 1. 定义模型(Codable + FetchableRecord)struct User: Codable, FetchableRecord, PersistableRecord { var id: Int64? var name: String\