O armazenamento de dados é uma das principais tarefas de um aplicativo móvel, afetando o desempenho, a segurança e a experiência do usuário. Neste artigo, abordaremos SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore e Keychain, bem como formatos de serialização (JSON, Protobuf) e bibliotecas (Gson, Moshi, kotlinx.serialization). Este guia ajudará desenvolvedores iniciantes a escolher a solução de armazenamento de dados correta. Saiba mais no guia oficial do Android sobre armazenamento de dados.
Pontos principais
Para armazenar dados estruturados com relacionamentos entre entidades, são usados bancos de dados relacionais.
SQLite é um banco de dados relacional embutido que funciona em qualquer plataforma móvel. Não requer servidor separado e os dados são armazenados em um único arquivo. SQLite é a base para Room (Android) e opcionalmente para Core Data (iOS). Bibliotecas: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room é a biblioteca oficial do Android Architecture Components para trabalhar com SQLite. Fornece uma camada ORM: Entity (tabela), DAO (consultas), Database (ponto de entrada). Room verifica consultas SQL em tempo de compilação, suporta corrotinas e Flow e migra o esquema automaticamente.
@Entity data class User( @PrimaryKey val id: Int, val name: String, val email: String ) @Dao interface UserDao { @Query("SELECT * FROM user WHERE id = :id") suspend fun getUser(id: Int): User? }
Core Data é o framework da Apple para gerenciar um grafo de objetos. Não é um banco de dados puro — é uma camada de persistência sobre SQLite, XML ou armazenamento binário. Core Data gerencia objetos (NSManagedObject), relacionamentos, versionamento de esquema, desfazer/refazer e multitarefa através do NSManagedObjectContext.
Realm é uma alternativa ao SQLite, projetada como um banco de dados móvel de alto desempenho. Realm é mais rápido que SQLite em leitura e escrita, suporta notificações reativas (Live Objects), criptografia em tempo real e multiplataforma (Android, iOS, Flutter, React Native). Desvantagens: maior tamanho de APK/IPA e maior consumo de memória.
Para armazenar pequenas quantidades de dados (configurações, tokens, cache), são usados armazenamentos simples de pares chave-valor.
SharedPreferences é um armazenamento legado de pares chave-valor no Android. Desvantagens: acesso síncrono (bloqueia a UI na leitura), falta de tipagem, risco de ANR ao carregar arquivos grandes. NÃO recomendado para novos projetos.
DataStore é a substituição moderna do SharedPreferences do Google. Funciona de forma assíncrona via Kotlin Coroutines e Flow, suporta Preferences DataStore (chave-valor) e Proto DataStore (dados tipados via Protobuf). DataStore é seguro para a thread da UI e suporta transações.
UserDefaults é o armazenamento padrão para pequenas configurações no iOS. Suporta tipos primitivos, strings, datas, Data. UserDefaults é síncrono, portanto não é adequado para grandes volumes de dados. O registro de valores via register(defaults:) define os valores padrão.
Para armazenamento de dados em aplicativos que exigem sincronização entre dispositivos, são usados bancos de dados na nuvem do Firebase.
Firebase Firestore é um banco de dados documental NoSQL com assinaturas em tempo real, escalonamento automático, consultas poderosas e modo offline integrado. Os dados são organizados em coleções e documentos (estruturas semelhantes a JSON). Firestore suporta transações e operações em lote. Ideal para chats, feeds e aplicativos sociais.
Firebase Realtime Database é um banco de dados NoSQL mais antigo do Firebase que armazena dados como uma única árvore JSON. Mais simples que o Firestore, mas menos flexível em consultas e escalonamento. Recomendado para aplicativos simples em tempo real (status online, chats simples).
| Característica | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Modelo de dados | Coleções → Documentos | Árvore JSON |
| Consultas | Complexas (filtragem, ordenação, limites) | Simples (por chave) |
| Escalonamento | Automático | Fragmentação manual |
| Modo offline | Sim (cache persistente) | Sim |
| Preço | Por operações de leitura/escrita | Por tráfego + armazenamento |
O armazenamento de tokens, senhas e chaves de criptografia requer armazenamentos protegidos especiais.
Android Keystore é um armazenamento do sistema para chaves criptográficas. As chaves são armazenadas em um ambiente de hardware (TEE — Trusted Execution Environment), inacessível para aplicativos e SO. Suporta geração de chaves, criptografia e assinatura. Android 9+ inclui StrongBox Keymaster (chip dedicado).
Keychain Services é um armazenamento seguro do iOS para senhas, chaves e certificados. Os dados são criptografados usando o Secure Enclave de hardware. Keychain suporta níveis de acessibilidade: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences é um wrapper sobre SharedPreferences com criptografia de chaves e valores usando AES256-GCM e HKDF. Implementado na biblioteca AndroidX Security. Recomendado para armazenar tokens e configurações confidenciais.
Na IT Sectr, usamos Android Keystore + EncryptedSharedPreferences para armazenar tokens de atualização e chaves biométricas. No iOS, usamos Keychain com o nível kSecAttrAccessibleWhenUnlockedThisDeviceOnly para máxima segurança.
Para armazenamento de arquivos (imagens, vídeos, documentos), as plataformas móveis fornecem vários tipos de armazenamento.
O Android distingue entre Internal Storage (/data/data/pacote/ — armazenamento privado) e External Storage (cartão SD ou partição emulada). Cache Directory é armazenamento temporário que o sistema pode limpar. Scoped Storage (Android 10+) restringe o acesso ao External Storage — os aplicativos veem apenas seus próprios arquivos ou arquivos via MediaStore/SAF.
O iOS fornece Documents Directory (backup do iCloud, dados persistentes), Library/Caches (arquivos temporários, sem backup) e Tmp Directory (temporários, podem ser limpos). Use NSFileManager para trabalhar com o sistema de arquivos. iOS 11+ suporta File Provider para arquivos na nuvem.
Serialização converte objetos em um formato para transmissão ou armazenamento. Desserialização é o processo inverso.
JSON (JavaScript Object Notation) é o formato mais popular: legível, flexível, suportado por todas as plataformas. XML é mais rigoroso, usado em sistemas legados. Protobuf (Protocol Buffers) é um formato binário do Google: 3-10x mais compacto que JSON, analisa mais rápido e tem esquema estrito. Usado para sistemas de alta carga e microsserviços.
JSONSerialization é a API integrada para trabalhar com JSON. Codable (Encodable/Decodable) é um protocolo Swift moderno para serialização automática em JSON, Property List e outros formatos.
struct User: Codable { let id: Int let name: String let email: String } let user = User(id: 1, name: "Alice", email: "alice@example.com") let encoder = JSONEncoder() let jsonData = try encoder.encode(user)
Para Flutter e React Native, existem bibliotecas de armazenamento eficientes próprias.
Hive é um armazenamento chave-valor leve e rápido para Flutter. Não requer código nativo (Dart puro), suporta tipagem via TypeAdapter e funciona em isolates. Ideal para cache, configurações e pequenos volumes de dados.
ObjectBox é um banco de dados embutido de alto desempenho para Flutter, Android e iOS. É 10x mais rápido que SQLite, usa estrutura de arquivo plana para sobrecarga mínima. Suporta relacionamentos, consultas e assinaturas reativas (ObjectBox Dart).
Drift é uma biblioteca SQLite reativa para Flutter e Dart. Fornece consultas type-safe, migrações, funções DAO e suporte a Stream (atualizações reativas). Drift é a principal escolha para projetos Flutter que exigem SQLite.
Perguntas frequentes
A escolha depende da plataforma: Room (Android) é a biblioteca oficial baseada em SQLite com verificação de consultas em tempo de compilação. Core Data (iOS) é o framework da Apple com grafo de objetos. Para projetos multiplataforma, Realm ou SQLite via ORM são adequados.
SharedPreferences é uma implementação antiga com acesso síncrono e risco de ANR. DataStore (Jetpack) é uma substituição moderna baseada em Kotlin Coroutines e Flow, suportando assincronicidade, tipagem e proteção contra erros.
Android: EncryptedSharedPreferences ou Android Keystore. iOS: Keychain Services com acessibilidade WhenUnlockedThisDeviceOnly. Para dados críticos, use Secure Enclave (iOS) e Keystore de hardware (Android) com biometria.
Cloud Firestore é um banco de dados NoSQL do Firebase com sincronização em tempo real, modo offline e escalonamento automático. Adequado para chats, feeds de notícias e projetos que precisam de sincronização entre dispositivos.
Flutter: Hive (chave-valor rápido), Floor (ORM SQLite), Drift (Moor, SQLite reativo), ObjectBox (BD embutido de alto desempenho). React Native: Realm, WatermelonDB (carregamento lento) e AsyncStorage (análogo ao SharedPreferences).
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.