Armazenamento de dados no desenvolvimento móvel: o que é, métodos e como funciona

Autor: IT Sectr Publicado: 2026-03-08 Tempo de leitura: 9 min

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

  • Room (Android) e Core Data (iOS) são os ORMs oficiais para trabalhar com bancos de dados relacionais em cada plataforma
  • SharedPreferences (Android) está sendo substituído pelo DataStore — um armazenamento assíncrono e type-safe de pares chave-valor
  • Para armazenamento seguro de tokens, use Keystore (Android) e Keychain (iOS) com proteção de hardware
  • Firebase Firestore é um banco de dados NoSQL com sincronização em tempo real e modo offline
  • Serialização — conversão de objetos para JSON/Protobuf usando Gson, Moshi, kotlinx.serialization

Bancos de dados locais: SQLite, Room, Core Data, Realm

Para armazenar dados estruturados com relacionamentos entre entidades, são usados bancos de dados relacionais.

SQLite

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 (Android)

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.

kotlin
@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 (iOS)

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

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.

Armazenamento chave-valor e configurações

Para armazenar pequenas quantidades de dados (configurações, tokens, cache), são usados armazenamentos simples de pares chave-valor.

SharedPreferences (Android)

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 (Jetpack Android)

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.

NSUserDefaults (iOS)

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.

Bancos de dados na nuvem: Firebase Firestore e Realtime DB

Para armazenamento de dados em aplicativos que exigem sincronização entre dispositivos, são usados bancos de dados na nuvem do Firebase.

Cloud Firestore

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

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 dadosColeções → DocumentosÁrvore JSON
ConsultasComplexas (filtragem, ordenação, limites)Simples (por chave)
EscalonamentoAutomáticoFragmentação manual
Modo offlineSim (cache persistente)Sim
PreçoPor operações de leitura/escritaPor tráfego + armazenamento

Armazenamento seguro: Keystore, Keychain e EncryptedSharedPreferences

O armazenamento de tokens, senhas e chaves de criptografia requer armazenamentos protegidos especiais.

Android Keystore

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).

iOS Keychain

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 (Android)

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.

Armazenamento de arquivos: Internal, External, Cache Directory

Para armazenamento de arquivos (imagens, vídeos, documentos), as plataformas móveis fornecem vários tipos de armazenamento.

Android Storage

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.

iOS Storage

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 de dados: JSON, Protobuf e bibliotecas

Serialização converte objetos em um formato para transmissão ou armazenamento. Desserialização é o processo inverso.

Formatos

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.

Bibliotecas Android

  • Gson (Google) — simples, flexível, mas lento. Funciona automaticamente com objetos Java/Kotlin
  • Moshi (Square) — mais rápido que Gson, melhor suporte Kotlin (propriedades não nulas, valores padrão, classes sealed)
  • kotlinx.serialization — serialização nativa Kotlin da JetBrains, funciona em tempo de compilação, suporta JSON, Protobuf, CBOR

Bibliotecas iOS

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.

swift
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)

Soluções multiplataforma: Hive, ObjectBox, Drift

Para Flutter e React Native, existem bibliotecas de armazenamento eficientes próprias.

Hive (Flutter)

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

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 (anteriormente Moor)

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

O que é melhor para armazenamento local de dados: Room ou Core Data?

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.

Qual a diferença entre SharedPreferences e DataStore?

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.

Como armazenar tokens e senhas com segurança em um aplicativo móvel?

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.

O que é Firebase Firestore e quando usá-lo?

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.

Quais ORMs existem para Flutter e React Native?

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

  • Room (Android) e Core Data (iOS) são as soluções oficiais para bancos de dados relacionais em cada plataforma
  • DataStore substitui SharedPreferences para armazenamento assíncrono de configurações
  • Keystore / Keychain são obrigatórios para armazenamento seguro de tokens e chaves
  • Firebase Firestore é a melhor escolha para sincronização em tempo real entre dispositivos
  • Kotlinx.serialization (Android) e Codable (iOS) são abordagens modernas de serialização
  • Para Flutter: Drift (SQLite), Hive (chave-valor), ObjectBox (alto desempenho)
  • Realm é uma alternativa multiplataforma ao SQLite com notificações reativas

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.

Discutir o projeto