Middle
Ar dirbote su DataStore Preferences?
sobes.tech AI
Atsakymas iš AI
Taip, aš dirbau su Jetpack DataStore Preferences.
Tai šiuolaikiškesnis ir saugesnis būdas saugoti mažus duomenų kiekius, palyginti su SharedPreferences. Jis pagrįstas Kotlin Coroutines ir Flow, todėl jis yra asinchroninis, atsparus klaidoms ir saugus kelių srautų aplinkoje.
Pagrindiniai DataStore Preferences privalumai:
- Asinchroniškumas: Skaitymo ir rašymo operacijos vykdomos asinchroniškai, neblokuojant pagrindinio srauto.
- Saugumas: Palaiko atominius atnaujinimo veiksmus, užkertant kelią duomenų sugadinimui.
- Kelių srautų saugumas: Saugu naudoti daugiaprocesinėje aplinkoje.
- Flow palaikymas: Naudojamas Flow duomenų atnaujinimams realiu laiku gauti.
- Griežtas tipizavimas: Palaiko įvairių duomenų tipų palaikymą naudojant
Preferences.Key.
Pavyzdys naudojimo:
Sukuriame DataStore:
// preferences_datastore.kt
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
Sukuriame raktus duomenų saugojimui:
// PreferencesKeys.kt
object PreferencesKeys {
val EXAMPLE_COUNTER = intPreferencesKey("example_counter")
val EXAMPLE_TEXT = stringPreferencesKey("example_text")
val EXAMPLE_BOOLEAN = booleanPreferencesKey("example_boolean")
}
Duomenų skaitymas:
// ExampleUsage.kt
// Skaityti reikšmę naudojant Flow
scope.launch {
context.dataStore.data
.map { preferences ->
// Gauti reikšmę pagal raktą, su numatytąja reikšme
preferences[PreferencesKeys.EXAMPLE_COUNTER] ?: 0
}
.collect { counter ->
// Apdoroti gautą reikšmę
println("Counter: $counter")
}
}
// Skaityti dabartinę reikšmę naudojant first()
scope.launch {
val counter = context.dataStore.data.first()[PreferencesKeys.EXAMPLE_COUNTER] ?: 0
println("Current counter: $counter")
}
Rašyti duomenis:
// ExampleUsage.kt
scope.launch {
context.dataStore.edit { settings ->
// Atnaujinti reikšmę pagal raktą
settings[PreferencesKeys.EXAMPLE_COUNTER] = (settings[PreferencesKeys.EXAMPLE_COUNTER] ?: 0) + 1
settings[PreferencesKeys.EXAMPLE_TEXT] = "New text value"
}
}
DataStore Preferences puikiai tinka naudotojo nustatymų, funkcijų žymeklių ir kitų panašių duomenų saugojimui, kur nereikia sudėtingos duomenų struktūros ar ryšių. Sudėtingesniems scenarijams aš svarstyčiau naudoti DataStore Proto arba Room.