DataStore a SharedPreferences
Dowiedz się, dlaczego DataStore to nowoczesny wybór
DataStore a SharedPreferences to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 4 lekcji w sumie.
Przechowywanie niewielkich ustawień
Prawie każda aplikacja musi zapamiętywać niewielkie ilości danych: przełącznik trybu ciemnego, ostatnio używaną kartę czy nazwę użytkownika. Są to preferencje klucz-wartość, a nie duże dane relacyjne.
Przez wiele lat Android używał do tego celu SharedPreferences. Obecnie zalecanym rozwiązaniem jest DataStore.
Czym jest SharedPreferences
SharedPreferences to prosty magazyn klucz-wartość oparty na XML. Otrzymujesz edytor, wstawiasz wartości i zatwierdzasz je.
- Łatwy w użyciu
- Wbudowany we framework
- Synchroniczne API, które może blokować wątek interfejsu użytkownika
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
prefs.edit().putBoolean("dark_mode", true).apply()
val dark = prefs.getBoolean("dark_mode", false)Problemy z SharedPreferences
SharedPreferences ma istotne wady:
- Odczyty za pomocą
getX()mogą blokować wątek wywołujący (często jest to wątek główny) commit()wykonuje synchroniczne operacje wejścia-wyjścia na dysku- Brak wbudowanego sposobu sygnalizowania błędów
- API nie zapewnia bezpieczeństwa typów ani reaktywności
Czas na DataStore
DataStore to nowoczesny zamiennik oparty na Kotlin coroutines i Flow. Wszystkie operacje na dysku wykonuje poza wątkiem głównym, a dane udostępnia jako obserwowalny strumień.
Dostępne są dwa warianty: Preferences DataStore (klucz-wartość) i Proto DataStore (typowane obiekty).
Asynchroniczność od podstaw
DataStore nigdy nie blokuje interfejsu użytkownika. Odczyty są udostępniane przez obiekt Flow, który zbierasz, a zapisy są funkcjami suspend wywoływanymi z korutyny.
Oznacza to, że odczyty i zapisy ustawień są bezpieczne nawet w wątku głównym, ponieważ kosztowne operacje są wykonywane w tle.
val darkMode: Flow<Boolean> = dataStore.data
.map { prefs -> prefs[DARK_MODE_KEY] ?: false }Aktualizacje reaktywne
Ponieważ DataStore udostępnia obiekt Flow, interfejs użytkownika automatycznie się aktualizuje, gdy zmieni się wartość. W przypadku SharedPreferences trzeba było rejestrować niewygodny listener zmian.
W Jetpack Compose wystarczy użyć collectAsState() do zebrania danych z flow, a ekran zostanie ponownie skomponowany po każdej aktualizacji.
Transakcyjność i spójność
Zapisy w DataStore są transakcyjne. Aktualizacja kończy się pełnym sukcesem albo pełnym niepowodzeniem, więc nigdy nie odczytasz częściowo zapisanej wartości.
DataStore gwarantuje również spójność danych podczas wielu odczytów i zapisów w obrębie tego samego procesu.
Obsługa błędów
SharedPreferences po cichu ignoruje problemy z operacjami wejścia-wyjścia. DataStore je ujawnia: odczyt może wyemitować IOException przez flow, a Ty możesz przechwycić ten wyjątek za pomocą catch i odpowiednio zareagować.
val settings: Flow<Settings> = dataStore.data
.catch { e ->
if (e is IOException) emit(emptyPreferences())
else throw e
}
.map { /* map to your model */ }Kiedy DataStore nie jest właściwym rozwiązaniem
DataStore służy do przechowywania małych lub średnich ilości danych klucz-wartość albo danych typowanych. Nie jest bazą danych.
- Duże zbiory danych, zapytania i relacje: użyj Room
- Pliki, obrazy i multimedia: użyj systemu plików
- Niewielka liczba ustawień: użyj DataStore
Dodawanie zależności
Aby używać Preferences DataStore, należy dodać artefakt do pliku Gradle modułu. Dla Proto DataStore istnieje osobny artefakt.
dependencies {
implementation("androidx.datastore:datastore-preferences:1.1.1")
}Migracja z SharedPreferences
Nie trzeba przepisywać wszystkiego naraz. DataStore udostępnia SharedPreferencesMigration, które podczas pierwszego odczytu automatycznie kopiuje istniejące wartości.
val Context.dataStore by preferencesDataStore(
name = "settings",
produceMigrations = { context ->
listOf(SharedPreferencesMigration(context, "settings"))
}
)Szybkie sprawdzenie
Sprawdź swoje rozumienie powodów, dla których preferowany jest DataStore.
Podsumowanie
Dowiedziałeś się, dlaczego DataStore jest nowoczesnym rozwiązaniem do ustawień w postaci par klucz-wartość:
- SharedPreferences może blokować główny wątek i nie jest reaktywny
- DataStore używa korutyn i
Flowdo bezpiecznego asynchronicznego dostępu - Zapisy są transakcyjne i mają odpowiednią obsługę błędów
- Istnieją dwa warianty: Preferences i Proto
Następnie w praktyce użyjesz delegata preferencesDataStore.
Często zadawane pytania
Czy lekcja „DataStore a SharedPreferences” jest bezpłatna?
Tak — pełny tekst „DataStore a SharedPreferences” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „DataStore a SharedPreferences”?
Dowiedz się, dlaczego DataStore to nowoczesny wybór Ćwiczysz Android Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Android Academy?
Nie wymagamy żadnego doświadczenia. Android Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „DataStore a SharedPreferences”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Android Academy?
Tak. Każda lekcja Android Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- DataStore a SharedPreferences
- Preferences DataStore
- Odczytywanie i zapisywanie ustawień
- Proto DataStore