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.