Sobes.tech
Middle

Czy pracowałeś z DataStore Preferences?

sobes.tech AI

Odpowiedź od AI

Tak, pracowałem z Jetpack DataStore Preferences.

Jest to nowoczesny i bezpieczniejszy sposób przechowywania małych ilości danych w porównaniu do SharedPreferences. Opiera się na Kotlin Coroutines i Flow, co czyni go asynchronicznym, odpornym na błędy i bezpiecznym dla wątków.

Główne zalety DataStore Preferences:

  • Asynchroniczność: Operacje odczytu i zapisu są wykonywane asynchronicznie, nie blokując głównego wątku.
  • Bezpieczeństwo: Obsługuje atomowe operacje aktualizacji, zapobiegając uszkodzeniu danych.
  • Bezpieczeństwo wątków: Bezpieczny do użycia w środowiskach wielowątkowych.
  • Wsparcie Flow: Użycie Flow do otrzymywania aktualizacji danych w czasie rzeczywistym.
  • Ścisłe typowanie: Obsługuje różne typy danych za pomocą Preferences.Key.

Przykład użycia:

Tworzenie DataStore:

// preferences_datastore.kt
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")

Tworzenie kluczy do przechowywania danych:

// PreferencesKeys.kt
object PreferencesKeys {
    val EXAMPLE_COUNTER = intPreferencesKey("example_counter")
    val EXAMPLE_TEXT = stringPreferencesKey("example_text")
    val EXAMPLE_BOOLEAN = booleanPreferencesKey("example_boolean")
}

Odczyt danych:

// ExampleUsage.kt
// Odczyt wartości za pomocą Flow
scope.launch {
    context.dataStore.data
        .map { preferences ->
            // Pobierz wartość po kluczu, podając wartość domyślną
            preferences[PreferencesKeys.EXAMPLE_COUNTER] ?: 0
        }
        .collect { counter ->
            // Przetwarzanie otrzymanej wartości
            println("Counter: $counter")
        }
}

// Odczyt bieżącej wartości za pomocą first()
scope.launch {
    val counter = context.dataStore.data.first()[PreferencesKeys.EXAMPLE_COUNTER] ?: 0
    println("Bieżący licznik: $counter")
}

Zapis danych:

// ExampleUsage.kt
scope.launch {
    context.dataStore.edit { settings ->
        // Aktualizacja wartości po kluczu
        settings[PreferencesKeys.EXAMPLE_COUNTER] = (settings[PreferencesKeys.EXAMPLE_COUNTER] ?: 0) + 1
        settings[PreferencesKeys.EXAMPLE_TEXT] = "Nowa wartość tekstu"
    }
}

DataStore Preferences jest odpowiedni do przechowywania ustawień użytkownika, flag funkcji i innych podobnych informacji, gdzie nie wymaga się złożonej struktury danych lub relacji. Dla bardziej skomplikowanych scenariuszy rozważyłbym DataStore Proto lub Room.