Sobes.tech
Middle

Да ли сте радили са DataStore Preferences?

sobes.tech АИ

Одговор од АИ

Да, радио сам са Jetpack DataStore Preferences.

Ово је савременији и безбеднији начин чувања малих количина података у поређењу са SharedPreferences. Основан је на Kotlin Coroutines и Flow, што га чини асинхроним, отпорним на кварове и безбедним за рад у више потока.

Главне предности DataStore Preferences:

  • Асинхроност: Операције читања и писања се извршавају асинхроно, без блокирања главног тока.
  • Безбедност: Подржава атомарне операције ажурирања, спречавајући оштећење података.
  • Потокобезбедност: Безбедно за коришћење у мулти-тред окружењу.
  • Подршка за Flow: Коришћење Flow за добијање ажурирања података у реалном времену.
  • Строга типизација: Подржава различите типове података помоћу Preferences.Key.

Пример коришћења:

Креирамо DataStore:

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

Креирамо кључеве за чување података:

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

Читање података:

// ExampleUsage.kt
// Читање вредности преко Flow
scope.launch {
    context.dataStore.data
        .map { preferences ->
            // Добијање вредности по кључу, са подразумеваном вредношћу
            preferences[PreferencesKeys.EXAMPLE_COUNTER] ?: 0
        }
        .collect { counter ->
            // Обрада добијене вредности
            println("Counter: $counter")
        }
}

// Читање тренутне вредности помоћу first()
scope.launch {
    val counter = context.dataStore.data.first()[PreferencesKeys.EXAMPLE_COUNTER] ?: 0
    println("Current counter: $counter")
}

Писање података:

// ExampleUsage.kt
scope.launch {
    context.dataStore.edit { settings ->
        // Ажурирање вредности по кључу
        settings[PreferencesKeys.EXAMPLE_COUNTER] = (settings[PreferencesKeys.EXAMPLE_COUNTER] ?: 0) + 1
        settings[PreferencesKeys.EXAMPLE_TEXT] = "New text value"
    }
}

DataStore Preferences је погодан за чување корисничких подешавања, флагова функција и друге сличне информације, где није потребна сложена структура података или релационе везе. За сложеније сценарије, разматрао бих DataStore Proto или Room.