ORM para Swift (iOS/macOS): comparación y ejemplos
Al desarrollar aplicaciones para iOS y macOS, trabajar con datos locales es una de las tareas clave. El Mapeo Objeto-Relacional (ORM) permite a los desarrolladores trabajar con bases de datos utilizando un enfoque orientado a objetos, en lugar de escribir consultas SQL en bruto. En este artículo, analizaremos cuatro soluciones ORM principales para Swift: Core Data, Realm, GRDB y SwiftData. Conocerás sus fortalezas y debilidades, y también verás ejemplos de código para cada tecnología.
1. Core Data
Core Data es un framework de Apple, integrado en iOS, macOS, tvOS y watchOS. No es un ORM puro (más bien un framework de persistencia), pero realiza todas las funciones de un ORM: gestión del modelo de objetos, persistencia, deshacer cambios y vinculación con la UI a través de NSFetchedResultsController.
Ventajas:
- Integración profunda con el ecosistema de Apple (iCloud, SwiftUI, Combine)
- Soporte integrado para versionado y migración de datos
- Predicados y ordenamientos potentes
Desventajas:
- Configuración compleja y mucho código repetitivo (boilerplate)
- Problemas con la concurrencia (requiere un contexto estricto)
- Bajo rendimiento con grandes volúmenes de datos
Ejemplo de uso:
import CoreData
// 1. Creamos el modelo (en el Editor de Modelo de Datos de Xcode)// 2. Inicializamos el contenedorlet container = NSPersistentContainer(name: "MyModel")container.loadPersistentStores { _, error in if let error = error { fatalError("Error al cargar: \\(error)") }}
// 3. Guardar un objetolet context = container.viewContextlet user = User(context: context)user.name = "Iván"user.age = 30try? context.save()
// 4. Consultalet request: NSFetchRequest<User> = User.fetchRequest()request.predicate = NSPredicate(format: "age > %@", 18)let adults = try? context.fetch(request)2. Realm
Realm es un ORM de terceros popular, creado para plataformas móviles. Funciona más rápido que Core Data en la mayoría de los escenarios y es más fácil de usar. Realm utiliza su propio motor de almacenamiento, no SQLite.
Ventajas:
- Alta velocidad de lectura/escritura
- API simple (sin NSManagedObject)
- Soporte integrado para actualizaciones reactivas (a través de Realm Notifications)
Desventajas:
- Código cerrado (no es completamente open-source)
- Problemas con la migración al cambiar el modelo
- Soporte limitado para consultas complejas (JOIN, subconsultas)
Ejemplo de uso:
import RealmSwift
// 1. Definimos el modeloclass User: Object { @Persisted var name: String = "" @Persisted var age: Int = 0}
// 2. Creamos y guardamoslet realm = try! Realm()let user = User()user.name = "María"user.age = 25try! realm.write { realm.add(user)}
// 3. Consultalet adults = realm.objects(User.self).filter("age > 18")3. GRDB
GRDB es un ORM ligero para Swift, construido sobre SQLite. Proporciona control total sobre las consultas SQL, pero al mismo tiempo ofrece una interfaz orientada a objetos conveniente. GRDB es especialmente popular entre los desarrolladores que desean combinar el poder de SQL con la comodidad de Swift.
Ventajas:
- Acceso completo a SQL (se pueden escribir consultas complejas)
- Alto rendimiento (cercano a SQLite puro)
- Soporte para Swift Concurrency (async/await)
Desventajas:
- Requiere conocimiento de SQL
- Menos documentación que Core Data
- Sin soporte integrado para iCloud
Ejemplo de uso:
import GRDB
// 1. Definimos el modelo (Codable + FetchableRecord)struct User: Codable, FetchableRecord, PersistableRecord { var id: Int64? var name: String\ También en la biblioteca
ndarray en Rust: guía completa con ejemplos prácticos
Caché en Rust: Redis, Memcached y soluciones integradas
Integración de métricas de Prometheus en C++: biblioteca prometheus-cpp
Limitación de tasa en Rust: bibliotecas governor, leaky-bucket y middleware para servidores web