Middle
Já trabalhou com DataStore Preferences?
sobes.tech IA
Resposta da IA
Sim, trabalhei com Jetpack DataStore Preferences.
É um método moderno e mais seguro de armazenar pequenos volumes de dados em comparação com SharedPreferences. Baseia-se em Kotlin Coroutines e Flow, tornando-o assíncrono, resistente a falhas e seguro para threads.
As principais vantagens do DataStore Preferences:
- Assincronia: Operações de leitura e escrita são feitas de forma assíncrona, sem bloquear a thread principal.
- Segurança: Suporta operações de atualização atômicas, prevenindo corrupção de dados.
- Segurança para threads: Seguro para uso em ambientes multithread.
- Suporte a Flow: Uso de Flow para receber atualizações de dados em tempo real.
- Tipagem forte: Suporta diferentes tipos de dados usando
Preferences.Key.
Exemplo de uso:
Criando DataStore:
// preferences_datastore.kt
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
Criando chaves para armazenar dados:
// PreferencesKeys.kt
object PreferencesKeys {
val EXAMPLE_COUNTER = intPreferencesKey("example_counter")
val EXAMPLE_TEXT = stringPreferencesKey("example_text")
val EXAMPLE_BOOLEAN = booleanPreferencesKey("example_boolean")
}
Lendo dados:
// ExampleUsage.kt
// Leitura do valor via Flow
scope.launch {
context.dataStore.data
.map { preferences ->
// Obtém o valor pela chave, fornecendo um valor padrão
preferences[PreferencesKeys.EXAMPLE_COUNTER] ?: 0
}
.collect { counter ->
// Processa o valor recebido
println("Contador: $counter")
}
}
// Leitura do valor atual usando first()
scope.launch {
val counter = context.dataStore.data.first()[PreferencesKeys.EXAMPLE_COUNTER] ?: 0
println("Contador atual: $counter")
}
Escrevendo dados:
// ExampleUsage.kt
scope.launch {
context.dataStore.edit { settings ->
// Atualiza o valor pela chave
settings[PreferencesKeys.EXAMPLE_COUNTER] = (settings[PreferencesKeys.EXAMPLE_COUNTER] ?: 0) + 1
settings[PreferencesKeys.EXAMPLE_TEXT] = "Novo valor de texto"
}
}
O DataStore Preferences é adequado para armazenar configurações de usuário, flags de funcionalidades e outras informações semelhantes, onde não é necessária uma estrutura de dados complexa ou relações relacionais. Para cenários mais complexos, consideraria usar DataStore Proto ou Room.