DataStore versus SharedPreferences
Entenda por que DataStore é a escolha moderna.
DataStore versus SharedPreferences é uma aula grátis de Android Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Android Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Android Academy inclui 4 aulas no total.
Armazenando configurações pequenas
Quase todo aplicativo precisa lembrar pequenos dados: uma opção de modo escuro, a última aba usada ou um nome de usuário. Essas são preferências de chave e valor, não dados relacionais volumosos.
Durante anos, o Android usou SharedPreferences para isso. Hoje, a solução recomendada é o DataStore.
O que é SharedPreferences
SharedPreferences é um armazenamento simples de chave e valor baseado em XML. Você obtém um editor, insere valores e confirma as alterações.
- Fácil de usar
- Integrado ao framework
- API síncrona que pode bloquear a thread da interface
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
prefs.edit().putBoolean("dark_mode", true).apply()
val dark = prefs.getBoolean("dark_mode", false)Os problemas do SharedPreferences
SharedPreferences tem limitações reais:
- As leituras de
getX()podem bloquear a thread que faz a chamada (geralmente a thread principal) commit()realiza E/S de disco de forma síncrona- Não há uma forma integrada de sinalizar erros
- A API não é segura quanto aos tipos nem reativa
Entra o DataStore
DataStore é o substituto moderno, baseado nas corrotinas e no Flow do Kotlin. Ele realiza todo o trabalho de disco fora da thread principal e expõe os dados como um fluxo observável.
Há duas variantes: Preferences DataStore (chave e valor) e Proto DataStore (objetos tipados).
Assíncrono por definição
DataStore nunca bloqueia a interface. As leituras chegam por meio de um Flow que você coleta, e as gravações são funções suspend chamadas a partir de uma corrotina.
Isso significa que as leituras e gravações das configurações são seguras até mesmo na thread principal, pois o trabalho pesado acontece em um despachante em segundo plano.
val darkMode: Flow<Boolean> = dataStore.data
.map { prefs -> prefs[DARK_MODE_KEY] ?: false }Atualizações reativas
Como DataStore expõe um Flow, sua interface é atualizada automaticamente quando um valor muda. Com SharedPreferences, era necessário registrar um listener de alterações pouco prático.
No Jetpack Compose, basta aplicar collectAsState() ao fluxo, e a tela é recomposta a cada atualização.
Transacional e consistente
As gravações do DataStore são transacionais. Uma atualização é concluída totalmente ou falha totalmente, portanto você nunca lê um valor gravado pela metade.
Ele também garante a consistência dos dados entre várias leituras e gravações dentro do mesmo processo.
Tratamento de erros
SharedPreferences ignora silenciosamente problemas de E/S. DataStore os expõe: uma leitura pode emitir uma IOException pelo fluxo, da qual você pode se recuperar usando catch.
val settings: Flow<Settings> = dataStore.data
.catch { e ->
if (e is IOException) emit(emptyPreferences())
else throw e
}
.map { /* map to your model */ }Quando DataStore não é a resposta
DataStore é indicado para dados pequenos ou médios de chave e valor ou dados tipados. Ele não é um banco de dados.
- Grandes conjuntos de dados, consultas e relações: use Room
- Arquivos, imagens e mídia: use o sistema de arquivos
- Algumas configurações: use DataStore
Adicionando a dependência
Para usar o Preferences DataStore, adicione o artefato ao arquivo Gradle do seu módulo. Há um artefato separado para o Proto DataStore.
dependencies {
implementation("androidx.datastore:datastore-preferences:1.1.1")
}Migrando do SharedPreferences
Não é necessário reescrever tudo de uma vez. O DataStore oferece SharedPreferencesMigration para copiar automaticamente os valores existentes na primeira leitura.
val Context.dataStore by preferencesDataStore(
name = "settings",
produceMigrations = { context ->
listOf(SharedPreferencesMigration(context, "settings"))
}
)Verificação rápida
Teste sua compreensão sobre o motivo de o DataStore ser preferível.
Recapitulação
Você aprendeu por que o DataStore é a opção moderna para configurações de chave e valor:
- O SharedPreferences pode bloquear a thread principal e não é reativo
- O DataStore usa corrotinas e
Flowpara acesso assíncrono seguro - As gravações são transacionais e contam com tratamento adequado de erros
- Há duas variantes: Preferences e Proto
Em seguida, você usará o delegado preferencesDataStore na prática.
Perguntas Frequentes
A aula “DataStore versus SharedPreferences” é grátis?
Sim — o texto completo de “DataStore versus SharedPreferences” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Android Academy, atualize para CoddyKit PRO. O curso de Android Academy inclui 4 aulas no total.
O que vou aprender em “DataStore versus SharedPreferences”?
Entenda por que DataStore é a escolha moderna. Você pratica Android Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Android Academy?
Nenhuma experiência prévia é necessária. Android Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “DataStore versus SharedPreferences”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Android Academy?
Sim. Cada aula de Android Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- DataStore versus SharedPreferences
- DataStore de preferências
- Lendo e gravando configurações
- Proto DataStore