Sobes.tech
Junior

Czy pracowałeś z DataStore Preferences na Androidzie?

sobes.tech AI

Odpowiedź od AI

Tak, pracowałem.

Preferences DataStore to asynchroniczny odpowiednik SharedPreferences, zawarty w AndroidX DataStore. Umożliwia bezpieczne przechowywanie prostych par klucz-wartość, korzystając z KSP na Kotlin Flow lub RxJava3 do pracy asynchronicznej oraz Protobuf/Proto DataStore lub Proto DataStore dla typów danych.

Główne zalety Preferences DataStore w porównaniu do SharedPreferences:

  • Asynchroniczność: Działa z użyciem Flow lub RxJava3, co zapobiega blokowaniu głównego wątku i wyklucza problemy z ANR.
  • Bezpieczeństwo: Operacje odczytu/zapisu atomowe gwarantują spójność danych.
  • Bezpieczeństwo typów: Z Protobuf DataStore można zdefiniować schemat danych, co wyklucza błędy przy pracy z typami.
  • Reaktywność: Pozwala na obserwację zmian danych w czasie rzeczywistym.

Przykład użycia Preferences DataStore z Kotlin Flow:

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

// Odczyt danych
suspend fun readString(context: Context, key: String): String? {
    val preferencesKey = stringPreferencesKey(key)
    val preferences = context.dataStore.data.first()
    return preferences[preferencesKey]
}

// Zapis danych
suspend fun writeString(context: Context, key: String, value: String) {
    val preferencesKey = stringPreferencesKey(key)
    context.dataStore.edit { settings ->
        settings[preferencesKey] = value
    }
}

Przykład użycia KSP do tworzenia bezpiecznego dostępu typu:

// W build.gradle (:app) dodaj wtyczkę
plugins {
 ...
 id("com.google.devtools.ksp") version "1.7.21-1.0.8" // Przykładowa wersja, sprawdź aktualną
}

// W build.gradle (:app) dodaj zależności
dependencies {
 ...
 implementation("androidx.datastore:datastore-preferences:1.0.0") // Sprawdź aktualną wersję
 implementation("androidx.datastore:datastore-preferences-core:1.0.0") // Sprawdź aktualną wersję
 ksp("androidx.datastore:datastore-preferences-core:1.0.0") // Sprawdź aktualną wersję
}

// Definicja interfejsu dla KSP
interface SettingsPref {
    val appName: String
    val isNotificationsEnabled: Boolean
    val theme: Int
}

// Generacja implementacji za pomocą KSP
// Utworzy klasę typu SettingsPrefImpl, którą można używać do dostępu do danych

DataStore Preferences jest zalecaną metodą przechowywania prostych ustawień i danych w Android, zastępując przestarzałe SharedPreferences.