0Pricing
Android Academy · Lekcja

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 Flow do 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

  1. DataStore a SharedPreferences
  2. Preferences DataStore
  3. Odczytywanie i zapisywanie ustawień
  4. Proto DataStore
← Powrót do Android Academy