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

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

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

开始课程

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



在开发 iOS 和 macOS 应用程序时,开发者经常需要处理设备上的数据存储。为了简化与数据库的交互,ORM(对象关系映射)库被广泛使用,它们允许开发者像操作普通 Swift 对象一样处理数据,隐藏了 SQL 查询的复杂性。本文将介绍四种流行的解决方案:Core Data、Realm、GRDB 和 SQLite.swift,比较它们的特性并提供实际示例。



1. Core Data



Core Data 是 Apple 内置在 iOS 和 macOS 中的一个框架。它并非纯粹的 ORM,而是一个对象图管理框架,可以使用 SQLite、XML 或二进制存储。



优点:

  • 与 Apple 生态系统深度集成(SwiftUI、iCloud、撤销管理器)。
  • 可视化数据模型编辑器(Xcode Data Modeler)。
  • 支持版本控制和迁移。


缺点:

  • 学习门槛高(大量样板代码)。
  • 处理大数据集时存在性能问题。
  • 与 Apple 平台强绑定。


代码示例 (Swift):

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()request.predicate = NSPredicate(format: "age > 18")let users = try? context.fetch(request)


2. Realm



Realm 是一个专为移动应用设计的跨平台 ORM。它在读写操作上比 Core Data 更快。



优点:

  • 高性能(比 Core Data 快高达 10 倍)。
  • API 简单,无需编写 SQL。
  • 自动更新对象(实时对象)。
  • 支持响应式扩展(RxRealm、Combine)。


缺点:

  • 专有数据库文件格式。
  • 数据库大小受限(iOS 上最大 2 GB)。
  • 复杂查询灵活性较差。


代码示例 (Swift):

import RealmSwift

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

// 保存let realm = try! Realm()let user = User()user.name = "玛丽亚"user.age = 25

try! realm.write { realm.add(user)}

// 查询let users = realm.objects(User.self).filter("age > 18")for user in users { print("\\(user.name): \\(user.age)")}


3. GRDB



GRDB 是一个用于 Swift 的现代 SQLite 库。它结合了底层 SQL 访问的特性和 ORM 的便利性。



优点:

  • 极致性能(原生 SQLite)。
  • 支持 Combine 和 Swift Concurrency(async/await)。
  • 完全控制 SQL 查询。
  • 支持迁移和版本控制。


缺点:

  • 需要了解 SQL。
  • 更少“魔法”,更多手动代码。


代码示例 (Swift):

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 let user = User(nam

推荐