Realm é um banco de dados NoSQL orientado a objetos para dispositivos móveis, desenvolvido como alternativa ao SQLite e Core Data para iOS e Android. Os dados são armazenados em formato próprio com acesso direto aos objetos na memória, proporcionando alta velocidade de leitura e escrita. Graças às notificações reativas, sincronização automática através do Realm Sync e um modelo de dados multiplataforma, o Realm é usado em mais de 1 bilhão de dispositivos (dados MongoDB, 2025).
Pontos principais
Realm é um banco de dados orientado a objetos criado especificamente para aplicações móveis. Ao contrário do SQLite, o Realm não utiliza SQL nem modelo relacional — os dados são armazenados como objetos vivos (Live Objects), acessados diretamente sem uma camada ORM intermediária. O desenvolvedor trabalha com objetos normais da linguagem (Swift, Kotlin, Dart) que são salvos automaticamente no banco de dados.
O Realm surgiu em 2014 como uma startup Realm Inc., e em 2019 foi adquirido pela MongoDB Inc. Desde então, o Realm tem sido desenvolvido como MongoDB Realm — parte da plataforma unificada Atlas Device Sync para sincronização de dados móveis. O banco de dados local básico do Realm permanece gratuito e de código aberto (licença Apache 2.0), enquanto o Realm Sync (sincronização na nuvem) é distribuído por assinatura.
De acordo com o MongoDB Developer Report (2025), o Realm é usado em 15% das aplicações móveis como armazenamento local principal. Os principais casos de uso são aplicações com modo offline, modelos de objetos complexos e necessidade de sincronização entre dispositivos, onde o Realm supera o SQLite em velocidade de desenvolvimento e facilidade de trabalho com objetos.
Live Objects — cada objeto Realm está ligado ao disco através de um arquivo mapeado em memória (memory-mapped file). Alterar um objeto em qualquer thread é imediatamente refletido em todas as outras threads sem notificação manual. A interface do usuário é redesenhada automaticamente quando os dados mudam através de notificações do Realm. Zero-copy — o Realm não copia dados do banco de dados para objetos; os objetos são os dados na memória.
O núcleo do Realm é escrito em C++ e usa B+ Tree para indexação de dados. Ao contrário do SQLite, onde cada linha é um registro em uma tabela relacional, o Realm armazena objetos como nós em uma estrutura de grafo com referências diretas entre eles (forward pointers). Relacionamentos entre objetos não são chaves estrangeiras, mas ponteiros diretos, eliminando a necessidade de operações JOIN.
Os arquivos do Realm (extensão .realm) são mapeados em memória (memory-mapped) — o próprio SO gerencia o carregamento das páginas do arquivo na memória conforme são acessadas. Isso permite que o Realm trabalhe com bancos de dados maiores que a RAM disponível e fornece latência de leitura no nível das estruturas de dados nativas da linguagem (Swift Array ou Kotlin List) para dados que cabem na RAM.
Arquivos mapeados em memória — a tecnologia chave do Realm. Em vez de copiar dados do arquivo do banco de dados para objetos da linguagem (como o SQLite faz via sqlite3_step + sqlite3_column_*), o Realm mapeia o arquivo do banco de dados diretamente no espaço de endereçamento do processo. Os objetos da linguagem são simplesmente ponteiros para dados na memória mapeada. Alterar um objeto modifica o banco de dados no disco sem uma chamada save separada.
| Característica | Realm (zero-copy) | SQLite (cópia) |
|---|---|---|
| Leitura | Acesso direto à memória (nanossegundos) | Cópia para objeto (microssegundos) |
| Escrita | Escrita imediata em arquivo memory-mapped | save() com transação SQL INSERT/UPDATE |
| Relacionamentos | Ponteiros diretos (forward pointers) | Chave estrangeira + JOIN |
| Consumo de memória | Arquivo + cache de páginas do SO | Objetos + cache de páginas SQLite |
| Objetos vivos | Sim (atualização automática) | Não (requer nova consulta) |
O consumo de memória é maior no Realm durante leitura ativa (todo o arquivo ou grande parte está mapeado na memória), mas menor durante operações de escrita, pois não é necessária alocação de memória para cópias de objetos. Para bancos de dados de até 1 GB em dispositivos móveis, a abordagem memory-mapped oferece melhor desempenho geral que o SQLite com sua cópia intermediária.
SQLite é um sistema de gerenciamento de banco de dados relacional com SQL e transações ACID. Realm é um banco de dados NoSQL orientado a objetos com acesso memory-mapped. Core Data é a camada ORM da Apple sobre SQLite. Cada uma das três abordagens tem sua própria área de aplicação e pontos fortes. Realm vence em velocidade de acesso direto a objetos e reatividade, SQLite em versatilidade e maturidade, Core Data em integração com o ecossistema Apple.
O desempenho de leitura do Realm é 10-50% maior que o SQLite graças ao acesso zero-copy. Realm também é mais rápido na escrita devido à ausência de análise sintática SQL e modificação direta das páginas memory-mapped. No entanto, o Realm pode consumir mais RAM ao trabalhar com bancos de dados grandes (>500 MB), pois o arquivo é totalmente mapeado no espaço de endereçamento.
| Critério | Realm | SQLite | Core Data |
|---|---|---|---|
| Tipo | BD NoSQL orientado a objetos | SGBD relacional (SQL) | ORM sobre SQLite |
| Velocidade de leitura | Alta (zero-copy) | Média | Média (sobrecarga ORM) |
| Reatividade | Live Objects (integrado) | Precisa de wrapper (Room/GRDB) | NSFetchedResultsController |
| Sincronização | Realm Sync (MongoDB Atlas) | Requer implementação personalizada | NSPersistentCloudKitContainer |
| Plataformas | iOS, Android, Flutter, RN, Node.js | iOS, Android, Web, Desktop | Apenas iOS/macOS |
| Tamanho da biblioteca | ~4 MB | ~600 KB | Integrado no SDK |
A escolha entre Realm e SQLite muitas vezes se resume a prioridades: velocidade de desenvolvimento e reatividade (Realm) versus controle e versatilidade (SQLite). Realm é especialmente bom para MVPs e protótipos onde o modelo de dados muda frequentemente e é importante obter atualizações de UI ao vivo rapidamente. SQLite/Room é preferível para produtos maduros com grandes volumes de dados e consultas analíticas complexas.
Realm Kotlin SDK é a biblioteca oficial para Android, escrita em Kotlin (não é um wrapper sobre Java SDK). O modelo de dados é definido através de classes que herdam de RealmObject, com a anotação @PrimaryKey para um identificador único. Realm Kotlin suporta Kotlin Coroutines, Flow e KSP (Kotlin Symbol Processing) para geração de código em tempo de compilação.
RealmQuery fornece uma API type-safe para filtragem sem SQL. As consultas são construídas através de uma cadeia de métodos: query → filter → sort → find. O resultado pode ser retornado como uma lista (carregada na memória) ou como um Flow (fluxo reativo que atualiza quando os dados mudam). Realm Kotlin também suporta objetos aninhados e listas (RealmList).
Modelo de dados Realm é definido como uma classe de dados que implementa a interface RealmObject. O campo _id é marcado com @PrimaryKey para identificação única. O relacionamento um-para-muitos é implementado através de RealmList — uma lista de outros RealmObject. Todas as operações de escrita (criar, atualizar, excluir) são executadas dentro de um bloco de transação write.
class Project : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId().generate()
var name: String = ""
var tasks: RealmList<Task> = realmListOf()
}
class Task : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId().generate()
var title: String = ""
var isComplete: Boolean = false
}
val config = Realm.Configuration.Builder(
schema = setOf(Project::class, Task::class)
).build()
val realm = Realm.open(config)
realm.write { transactionRealm ->
val project = copyToRealm(Project().apply {
name = "Mobile App"
})
project.tasks.add(copyToRealm(Task().apply {
title = "Design UI"
}))
}
val projects: Flow<RealmResults<Project>> =
realm.query<Project>()
.sort(Project::name, Sort.ASCENDING)
.asFlow()
Uma consulta que retorna Flow emite automaticamente novos resultados a qualquer mudança de dados no Realm: adicionar, atualizar ou excluir um Project ou Task. A abordagem Flow combina perfeitamente com Compose: collectAsState() no ViewModel recompõe automaticamente a UI quando os dados mudam sem atualizar manualmente os adaptadores de lista ou usar LiveData.
Realm Swift SDK fornece uma API nativa Swift com suporte para async/await, Combine Publishers e Swift Concurrency. Os modelos de dados são definidos como classes que herdam de Object, usando @Persisted para propriedades. Realm Swift atualiza automaticamente os objetos nas mudanças, e as notificações (NotificationToken) permitem subscrever mudanças de objetos ou coleções individuais.
@ObservedRealmObject e @ObservedResults são Property Wrappers para SwiftUI que redesenham automaticamente a View quando os dados do Realm mudam. @ObservedResults trabalha com resultados de consulta, @ObservedRealmObject com um objeto específico. Ambas as propriedades cancelam a subscrição quando a View é desinicializada.
Integração com SwiftUI Realm é um dos pontos fortes do SDK. O Property Wrapper @ObservedResults liga uma consulta Realm com a exibição em SwiftUI. Quando qualquer tarefa muda, SwiftUI recompõe automaticamente a lista. realm.writeAsync executa transações em uma thread de fundo sem bloquear a UI.
import RealmSwift
class TaskItem: Object, Identifiable {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var title: String = ""
@Persisted var isDone: Bool = false
@Persisted var priority: Int = 0
}
struct TaskListView: View {
@ObservedResults(TaskItem.self,
sortDescriptor: SortDescriptor(["priority"]))
var tasks
var body: some View {
List {
ForEach(tasks) { task in
TaskRow(task: task)
}
}
Button("Add Task") {
let realm = try! Realm()
try! realm.write {
realm.add(TaskItem(value: ["title": "New task"]))
}
}
}
}
@ObservedResults gerencia automaticamente o ciclo de vida da consulta Realm: quando a View é criada, uma subscrição a mudanças é criada; quando destruída, é cancelada. O Property Wrapper aceita um predicado opcional (NSPredicate) e um descritor de ordenação. Isso elimina a necessidade de escrever manualmente requisições fetch, criar ViewModels e subscrever notificações do Realm.
Aplicações offline — Realm é ideal para cenários onde os dados devem estar disponíveis sem internet. A sincronização integrada (Realm Sync com MongoDB Atlas) resolve automaticamente conflitos ao conectar-se à rede. O aplicativo continua trabalhando com dados locais, e a sincronização em segundo plano os atualiza quando uma conexão fica disponível.
Interfaces reativas — Live Objects e notificações Flow/Combine tornam Realm uma escolha conveniente para aplicações com dados que mudam frequentemente: chats, feeds de tarefas, documentos colaborativos. A UI atualiza automaticamente quando dados são adicionados, alterados ou excluídos sem chamar manualmente reloadData ou invalidate.
Projetos multiplataforma — Realm suporta Kotlin Multiplatform (KMP), Flutter, React Native e Xamarin. O modelo de dados é definido uma vez e usado em todas as plataformas. Isso reduz a duplicação de código e garante consistência de esquema entre aplicações iOS e Android com lógica de negócios compartilhada.
Realm Sync é um serviço em nuvem integrado ao MongoDB Atlas. O aplicativo sincroniza automaticamente os dados entre os dispositivos do usuário e o servidor. Conflitos são resolvidos pela estratégia "last write wins" ou através de funções personalizadas de resolução de conflitos no servidor. Realm Sync suporta sincronização parcial (subconjunto de dados) para reduzir tráfego.
class SyncRepository {
private val app = App(
AppConfiguration(
appId = "my-realm-app-id"
)
)
suspend fun syncData() {
val user = app.login(Credentials.anonymous())
val config = SyncConfiguration.Builder(
user, setOf(Project::class)
).build()
val syncedRealm = Realm.open(config)
// A sincronização automática está ativa
}
}
SyncConfiguration configura a conexão ao MongoDB Atlas e define o conjunto de modelos a sincronizar. Após a autenticação do usuário, Realm carrega automaticamente os dados da nuvem e os mescla com as alterações locais. A sincronização é executada em uma thread de fundo e não requer chamadas manuais — basta criar uma instância Realm com SyncConfiguration.
Perguntas frequentes
Sim, o banco de dados local Realm é completamente gratuito (licença Apache 2.0). O Realm Sync (sincronização na nuvem) via MongoDB Atlas é um serviço pago incluído na assinatura Atlas Device Sync. O nível gratuito do Atlas inclui os primeiros 500 MB de dados e 1 milhão de operações por mês.
Sim, a migração é possível exportando dados do SQLite para JSON e importando para o Realm no primeiro carregamento da aplicação. Para grandes volumes, use migração em streaming: escreva dados em ambos os bancos em paralelo enquanto os usuários migram para a nova versão do aplicativo e, em seguida, exclua o arquivo SQLite.
Realm Sync usa por padrão a estratégia "last write wins" — a última escrita sobrescreve a anterior. Para conflitos complexos, configure funções personalizadas de resolução de conflitos no servidor MongoDB Atlas que mesclam alterações de diferentes dispositivos de acordo com a lógica de negócios da aplicação (por exemplo, mesclar valores em vez de substituir).
Realm não suporta agregações SQL (SUM, AVG, GROUP BY) no nível do banco de dados. Para consultas analíticas, recomenda-se exportar dados do Realm para MongoDB Atlas através do Realm Sync e executar agregações através do MongoDB Aggregation Pipeline. Para contagens simples, use realm.query<T>().count().
Realm não criptografa dados por padrão. Para criptografia, forneça uma chave de 64 bytes na configuração: Realm.Configuration(encryptionKey: key). A criptografia usa AES-256 + SHA-2 HMAC e aumenta a sobrecarga das operações em 10-20%. Sem criptografia, o arquivo .realm pode ser lido por qualquer processo com acesso ao sistema de arquivos.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também