ORM para Swift (iOS/macOS): comparación y ejemplos
Al desarrollar aplicaciones para iOS y macOS, a menudo surge la necesidad de trabajar con bases de datos locales. ORM (Object-Relational Mapping) permite trabajar con datos a través de objetos del lenguaje de programación, abstrayéndose de las consultas SQL. En el ecosistema Swift existen varias soluciones populares. En este artículo compararemos Core Data, Realm, GRDB y SwiftData, proporcionaremos ejemplos de código y ayudaremos a elegir la herramienta adecuada para su proyecto.
1. Core Data
Core Data es un framework integrado de Apple que proporciona no solo ORM, sino también una pila completa de gestión de objetos (grafo de objetos, lazy loading, undo/redo). Funciona con SQLite, XML o almacenamiento binario. La idea principal es trabajar a través de NSManagedObjectContext.
Ejemplo de código (Core Data)
import CoreData
// Creación del contextolet container = NSPersistentContainer(name: "Model")container.loadPersistentStores { _, error in if let error = error { print(error) }}
// Guardar objetolet context = container.viewContextlet user = User(context: context)user.name = "Iván"user.age = 30
try? context.save()
// Consultalet request: NSFetchRequest<User> = User.fetchRequest()let users = try? context.fetch(request)Ventajas: integración completa con Xcode, gestión automática de migraciones, soporte para iCloud.
Desventajas: curva de aprendizaje compleja, necesidad de crear el modelo de datos en el editor, mucho código boilerplate.
2. Realm
Realm es un ORM multiplataforma que funciona con su propio motor (no SQLite). Es más rápido que Core Data en la mayoría de las operaciones y tiene una API más simple. Soporta Swift, Objective-C, Kotlin, Java.
Ejemplo de código (Realm)
import RealmSwift
// Definición del modeloclass User: Object { @Persisted var name: String = "" @Persisted var age: Int = 0}
// Guardarlet realm = try! Realm()let user = User(value: ["name": "María", "age": 25])try! realm.write { realm.add(user)}
// Consultalet users = realm.objects(User.self).filter("age > 18")Ventajas: alto rendimiento, API conveniente, soporte integrado para Live Objects (actualización automática de la UI).
Desventajas: licencia propietaria (desde 2020 es de código abierto, pero con limitaciones), gran tamaño del binario, dificultades con las migraciones.
3. GRDB
GRDB es una biblioteca ligera para trabajar con SQLite en Swift. Proporciona tanto acceso de bajo nivel a SQL como un ORM de alto nivel con tipos Record. Es una excelente opción para quienes desean controlar las consultas SQL, pero no quieren escribirlas manualmente.
Ejemplo de código (GRDB)
import GRDB
// Definición de la estructurastruct User: Codable, FetchableRecord, PersistableRecord { var id: Int64? var name: String var age: Int}
// Conexión a la BDlet dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")
// Guardartry dbQueue.write { db in var user = User(name: "Alejandro", age: 28) try user.insert(db)}
// Consultalet users = try dbQueue.read { db in try User.filter(Column("age") >= 18).fetchAll(db)}Ventajas: peso ligero, control total sobre SQL, excelente documentación, soporte para Combine y Swift Concurrency.
Desventajas: requiere gestión manual de migraciones, no es tan "mágica" como Realm.
4. SwiftData (novedad de Apple)
SwiftData es un ORM moderno presentado en la WWDC 2023. Está construido sobre Core Data, pero utilizando macros de Swift (@Model, @Attribute, @Relationship). Permite describir modelos directamente en el código.
Ejemplo de código (SwiftData)
import SwiftDataimport SwiftUI
@Modelclass User { var name: String var age: Int init(name: String, age: También en la biblioteca
Colas de tareas en Kotlin: Coroutines, KJob y patrones avanzados
Trabajo con CSV en PHP: lectura, escritura y procesamiento de datos
Monitoreo de Node.js: herramientas y bibliotecas para observabilidad