Sobes.tech
Middle

Работили ли сте с DataStore Preferences?

sobes.tech AI

Отговор от AI

Да, работил съм с 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("Текущ брояч: $counter")
}

Записване на данни:

// ExampleUsage.kt
scope.launch {
    context.dataStore.edit { settings ->
        // Актуализиране на стойност по ключ
        settings[PreferencesKeys.EXAMPLE_COUNTER] = (settings[PreferencesKeys.EXAMPLE_COUNTER] ?: 0) + 1
        settings[PreferencesKeys.EXAMPLE_TEXT] = "Нова стойност на текста"
    }
}

DataStore Preferences е подходящ за съхранение на потребителски настройки, флагове за функции и подобна информация, където не е необходима сложна структура от данни или релации. За по-сложни сценарии бих разгледал DataStore Proto или Room.