Sobes.tech
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.