Swift(iOS/macOS)的ORM:比较与使用示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift(iOS/macOS)的ORM:比较与示例

在开发iOS和macOS应用时,经常需要处理本地数据库。ORM(对象关系映射)允许通过编程语言对象来操作数据,从而抽象掉SQL查询。在Swift生态系统中,有几种流行的解决方案。本文将比较Core Data、Realm、GRDB和SwiftData,提供代码示例,并帮助您为项目选择合适的工具。



1. Core Data

Core Data是Apple内置的框架,不仅提供ORM,还提供完整的对象管理栈(对象图、懒加载、撤销/重做)。它支持SQLite、XML或二进制存储。核心思想是通过NSManagedObjectContext进行操作。



代码示例(Core Data)

import CoreData

// 创建上下文let container = NSPersistentContainer(name: "Model")container.loadPersistentStores { _, error in if let error = error { print(error) }}

// 保存对象let context = container.viewContextlet user = User(context: context)user.name = "伊万"user.age = 30

try? context.save()

// 查询let request: NSFetchRequest<User> = User.fetchRequest()let users = try? context.fetch(request)


优点: 与Xcode完全集成,自动管理迁移,支持iCloud。

缺点: 学习曲线陡峭,需要在编辑器中创建数据模型,样板代码多。



2. Realm

Realm是一个跨平台ORM,运行在自己的引擎上(非SQLite)。在大多数操作中比Core Data更快,API也更简单。支持Swift、Objective-C、Kotlin、Java。



代码示例(Realm)

import RealmSwift

// 定义模型class User: Object { @Persisted var name: String = "" @Persisted var age: Int = 0}

// 保存let realm = try! Realm()let user = User(value: ["name": "玛丽亚", "age": 25])try! realm.write { realm.add(user)}

// 查询let users = realm.objects(User.self).filter("age > 18")


优点: 高性能,API便捷,内置Live Objects支持(自动更新UI)。

缺点: 专有许可证(自2020年起开源但有约束),二进制文件体积大,迁移复杂。



3. GRDB

GRDB是一个轻量级库,用于在Swift中操作SQLite。它既提供底层SQL访问,也提供带有Record类型的高级ORM。适合那些希望控制SQL查询但不想手动编写的人。



代码示例(GRDB)

import GRDB

// 定义结构体struct User: Codable, FetchableRecord, PersistableRecord { var id: Int64? var name: String var age: Int}

// 连接数据库let dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")

// 保存try dbQueue.write { db in var user = User(name: "阿列克谢", age: 28) try user.insert(db)}

// 查询let users = try dbQueue.read { db in try User.filter(Column("age") >= 18).fetchAll(db)}


优点: 轻量,完全控制SQL,文档优秀,支持Combine和Swift Concurrency。

缺点: 需要手动管理迁移,不如Realm那样“神奇”。



4. SwiftData(Apple的新产品)

SwiftData是WWDC 2023上推出的现代ORM。它构建在Core Data之上,但使用Swift宏(@Model、@Attribute、@Relationship)。允许直接在代码中描述模型。



代码示例(SwiftData)

import SwiftDataimport SwiftUI

@Modelclass User { var name: String var age: Int init(name: String, age:

推荐