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-preferenceshinzu - Erstellen Sie mit dem Delegaten
preferencesDataStoreeine einzelne Instanz - Definieren Sie typsichere Schlüssel mit
stringPreferencesKey,booleanPreferencesKeyusw. - Schreiben Sie mit
dataStore.edit { }innerhalb einer Coroutine - Lesen Sie Daten als
FlowmitdataStore.data.map { } - Behandeln Sie
IOExceptionmit.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
- Kotlin-Collections
- Grundlagen von RecyclerView
- Click-Ereignisse in RecyclerView
- SharedPreferences
- DataStore Preferences
- Adapter und DiffUtil