ORM para Swift (iOS/macOS): comparação e exemplos
Ao desenvolver aplicativos para iOS e macOS, surge frequentemente a necessidade de trabalhar com bancos de dados locais. ORM (Object-Relational Mapping) permite trabalhar com dados através de objetos da linguagem de programação, abstraindo-se das consultas SQL. No ecossistema Swift, existem várias soluções populares. Neste artigo, compararemos Core Data, Realm, GRDB e SwiftData, apresentaremos exemplos de código e ajudaremos a escolher a ferramenta adequada para o seu projeto.
1. Core Data
Core Data é um framework embutido da Apple que oferece não apenas ORM, mas também uma pilha completa de gerenciamento de objetos (grafo de objetos, lazy loading, undo/redo). Funciona com SQLite, XML ou armazenamento binário. A ideia principal é trabalhar através do NSManagedObjectContext.
Exemplo de código (Core Data)
import CoreData
// Criação do contextolet container = NSPersistentContainer(name: "Model")container.loadPersistentStores { _, error in if let error = error { print(error) }}
// Salvando um objetolet context = container.viewContextlet user = User(context: context)user.name = "Иван"user.age = 30
try? context.save()
// Consultalet request: NSFetchRequest<User> = User.fetchRequest()let users = try? context.fetch(request)Vantagens: integração total com Xcode, gerenciamento automático de migrações, suporte a iCloud.
Desvantagens: curva de aprendizado complexa, necessidade de criar o modelo de dados no editor, muito código boilerplate.
2. Realm
Realm é uma ORM multiplataforma que funciona em seu próprio motor (não SQLite). É mais rápida que Core Data na maioria das operações e possui uma API mais simples. Suporta Swift, Objective-C, Kotlin, Java.
Exemplo de código (Realm)
import RealmSwift
// Definição do modeloclass User: Object { @Persisted var name: String = "" @Persisted var age: Int = 0}
// Salvandolet realm = try! Realm()let user = User(value: ["name": "Мария", "age": 25])try! realm.write { realm.add(user)}
// Consultalet users = realm.objects(User.self).filter("age > 18")Vantagens: alta performance, API conveniente, suporte embutido a Live Objects (atualização automática da UI).
Desvantagens: licença proprietária (desde 2020 é aberta, mas com limitações), tamanho grande do binário, dificuldades com migrações.
3. GRDB
GRDB é uma biblioteca leve para trabalhar com SQLite em Swift. Ela oferece tanto acesso de baixo nível ao SQL quanto uma ORM de alto nível com tipos Record. É uma excelente escolha para quem deseja controlar consultas SQL, mas não quer escrevê-las manualmente.
Exemplo de código (GRDB)
import GRDB
// Definição da estruturastruct User: Codable, FetchableRecord, PersistableRecord { var id: Int64? var name: String var age: Int}
// Conexão ao BDlet dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")
// Salvandotry dbQueue.write { db in var user = User(name: "Алексей", age: 28) try user.insert(db)}
// Consultalet users = try dbQueue.read { db in try User.filter(Column("age") >= 18).fetchAll(db)}Vantagens: leve, controle total sobre SQL, excelente documentação, suporte a Combine e Swift Concurrency.
Desvantagens: requer gerenciamento manual de migrações, não é tão "mágica" quanto Realm.
4. SwiftData (novidade da Apple)
SwiftData é uma ORM moderna, apresentada na WWDC 2023. Ela é construída sobre o Core Data, mas usando macros Swift (@Model, @Attribute, @Relationship). Permite descrever modelos diretamente no código.
Exemplo de código (SwiftData)
import SwiftDataimport SwiftUI
@Modelclass User { var name: String var age: Int init(name: String, age: Também na biblioteca
Envio de email em Rust: bibliotecas lettre e async-smtp para mailings
Biblioteca Padrão Java: visão geral completa para iniciantes e profissionais
FastEndpoints C# (.NET): guia completo com exemplos práticos