0Pricing
Android Academy · Lektion

DataStore Preferences

Ersetzen Sie SharedPreferences durch die moderne DataStore-Bibliothek. Lesen Sie Daten als Kotlin Flow, schreiben Sie sie mit edit{} und behandeln Sie Fehler sicher.

DataStore Preferences ist eine kostenlose Android Academy-Lektion auf CoddyKit. Dies ist Lektion 5 von 6. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Android Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Android Academy-Kurs umfasst insgesamt 6 Lektionen.

Warum DataStore?

DataStore ist die moderne Alternative zu SharedPreferences. Es löst wichtige Probleme:

  • SharedPreferences blockiert den UI-Thread – DataStore ist vollständig asynchron
  • SharedPreferences kann unbehandelte Ausnahmen auslösen – DataStore behandelt Fehler über Flow
  • DataStore ist typsicher (Preferences) oder schemasicher (Proto)
  • Funktioniert nativ mit Kotlin Coroutines und Flow

Zwei Arten von DataStore

Wählen Sie den passenden Typ für Ihren Anwendungsfall:

  • Preferences DataStore — Schlüssel-Wert-Paare, kein Schema erforderlich. Am einfachsten einzurichten. Ideal für App-Einstellungen und Benutzervoreinstellungen.
  • Proto DataStore — typisierte Objekte mit Protocol Buffers. Erfordert eine .proto-Schemadatei. Ideal für strukturierte Daten.

Diese Lektion behandelt Preferences DataStore.

Dependency hinzufügen

Fügen Sie DataStore zu app/build.gradle hinzu:

// app/build.gradle
dependencies {
    implementation 'androidx.datastore:datastore-preferences:1.1.1'
    // Coroutines (likely already in your project)
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
}

DataStore-Instanz erstellen

Erstellen Sie den DataStore einmal mithilfe des Delegaten auf oberster Ebene. Dies geschieht üblicherweise in einer eigenständigen Datei:

import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.preferencesDataStore

// Top-level property — creates a single DataStore instance per Context
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_prefs")

Schlüssel definieren

Schlüssel sind typsichere Objekte und keine einfachen Zeichenfolgen. Erstellen Sie sie mit der passenden Factory-Funktion:

import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey

object PreferencesKeys {
    val DARK_MODE    = booleanPreferencesKey("dark_mode")
    val USER_NAME    = stringPreferencesKey("user_name")
    val LAUNCH_COUNT = intPreferencesKey("launch_count")
}

Daten schreiben

Schreiben Sie innerhalb einer Coroutine mit edit { }:

import androidx.datastore.preferences.core.edit

// In a ViewModel or Repository:
suspend fun saveDarkMode(enabled: Boolean) {
    context.dataStore.edit { prefs ->
        prefs[PreferencesKeys.DARK_MODE] = enabled
    }
}

suspend fun incrementLaunchCount() {
    context.dataStore.edit { prefs ->
        val current = prefs[PreferencesKeys.LAUNCH_COUNT] ?: 0
        prefs[PreferencesKeys.LAUNCH_COUNT] = current + 1
    }
}

Daten mit Flow lesen

DataStore stellt Daten als Flow bereit. Verwenden Sie map, um den benötigten Wert zu extrahieren:

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

val darkModeFlow: Flow<Boolean> = context.dataStore.data
    .map { prefs ->
        prefs[PreferencesKeys.DARK_MODE] ?: false  // default = false
    }

val userNameFlow: Flow<String> = context.dataStore.data
    .map { prefs ->
        prefs[PreferencesKeys.USER_NAME] ?: "Guest"
    }

In ViewModel sammeln

Stellen Sie DataStore-Flows aus einem ViewModel mithilfe von stateIn für eine effiziente Sammlung bereit:

class SettingsViewModel(private val repo: SettingsRepository) : ViewModel() {

    val isDarkMode: StateFlow<Boolean> = repo.darkModeFlow
        .stateIn(
            scope = viewModelScope,
            started = SharingStarted.WhileSubscribed(5000),
            initialValue = false
        )

    fun toggleDarkMode(enabled: Boolean) {
        viewModelScope.launch {
            repo.saveDarkMode(enabled)
        }
    }
}

In Activity/Fragment beobachten

Sammeln Sie den StateFlow in der UI mit lifecycleScope.launch:

// In Fragment:
lifecycleScope.launch {
    viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
        viewModel.isDarkMode.collect { darkMode ->
            binding.switchDarkMode.isChecked = darkMode
            AppCompatDelegate.setDefaultNightMode(
                if (darkMode) AppCompatDelegate.MODE_NIGHT_YES
                else AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
            )
        }
    }
}

Fehlerbehandlung

DataStore gibt IOException aus, wenn die Datei beschädigt ist. Fangen Sie die Ausnahme in Ihrer Flow-Pipeline ab:

import kotlinx.coroutines.flow.catch
import java.io.IOException

val safeFlow: Flow<Boolean> = context.dataStore.data
    .catch { exception ->
        if (exception is IOException) {
            emit(emptyPreferences())   // return defaults
        } else {
            throw exception
        }
    }
    .map { prefs ->
        prefs[PreferencesKeys.DARK_MODE] ?: false
    }

DataStore vs. SharedPreferences

Zusammenfassung, warum DataStore die bessere Wahl ist:

  • DataStore liest und schreibt automatisch in einem Hintergrundthread — kein ANR-Risiko
  • apply() von SharedPreferences kann unbemerkt fehlschlagen; DataStore gibt Fehler über den Flow weiter
  • DataStore ist reaktiv — die UI wird automatisch aktualisiert, wenn sich Daten ändern
  • SharedPreferences bietet keinen Migrationspfad; DataStore verfügt über eine integrierte SharedPreferencesMigration

Schnelltest

Welchen Hauptmechanismus verwendet DataStore, um seine Daten für den Rest der App bereitzustellen?

Zusammenfassung: DataStore Preferences

DataStore ist die moderne Methode, um einfache Daten dauerhaft zu speichern:

  • Fügen Sie die Abhängigkeit datastore-preferences hinzu
  • Erstellen Sie mit dem Delegaten preferencesDataStore eine einzelne Instanz
  • Definieren Sie typsichere Schlüssel mit stringPreferencesKey, booleanPreferencesKey usw.
  • Schreiben Sie mit dataStore.edit { } innerhalb einer Coroutine
  • Lesen Sie Daten als Flow mit dataStore.data.map { }
  • Behandeln Sie IOException mit .catch { emit(emptyPreferences()) }

Als Nächstes: Erstellen Sie effiziente Listen-Adapter mit DiffUtil.

Häufig gestellte Fragen

Ist die Lektion „DataStore Preferences“ kostenlos?

Ja — der vollständige Text von „DataStore Preferences“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Android Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Android Academy-Kurs umfasst insgesamt 6 Lektionen.

Was lerne ich in „DataStore Preferences“?

Ersetzen Sie SharedPreferences durch die moderne DataStore-Bibliothek. Lesen Sie Daten als Kotlin Flow, schreiben Sie sie mit edit{} und behandeln Sie Fehler sicher. Du übst Android Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Android Academy zu starten?

Keine Vorkenntnisse erforderlich. Android Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 5 von 6.

Wie lange dauert die Lektion „DataStore Preferences“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Android Academy-Lektion Code schreiben und ausführen?

Ja. Jede Android Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Kotlin-Collections
  2. Grundlagen von RecyclerView
  3. Click-Ereignisse in RecyclerView
  4. SharedPreferences
  5. DataStore Preferences
  6. Adapter und DiffUtil
← Zurück zu Android Academy