Proto DataStore
Przechowuj typowane dane strukturalne
Proto DataStore to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 4 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.
Proto DataStore
Proto DataStore przechowuje silnie typowane obiekty strukturalne zamiast luźnych par klucz-wartość. Definiujesz schemat, a DataStore przechowuje jeden typowany obiekt w każdym pliku.
Jest idealny, gdy ustawienia tworzą spójny model.
Dlaczego warto używać typowanych danych
Preferences DataStore nie jest typowany: literówka w kluczu lub odczyt niewłaściwego typu powoduje błąd dopiero w czasie działania. Proto DataStore zapewnia bezpieczeństwo typów na etapie kompilacji dla całego obiektu ustawień.
- Brak tekstowych kluczy, w których można popełnić literówkę
- Wartości domyślne zdefiniowane w schemacie
- Pola przyjazne refaktoryzacji
Wybór formatu serializatora
Klasyczne podejście wykorzystuje Protocol Buffers (proto) do definiowania schematu. Możesz także użyć kotlinx.serialization lub dowolnego niestandardowego formatu. Schemat opisuje pola i typy.
Definiowanie schematu Proto
Tworzysz plik .proto opisujący komunikat ustawień. Kompilator protobuf generuje na jego podstawie klasę Kotlin/Java.
syntax = "proto3";
option java_package = "com.example.app";
option java_multiple_files = true;
message UserSettings {
bool dark_mode = 1;
int32 font_size = 2;
string username = 3;
}Implementowanie serializatora
DataStore potrzebuje obiektu Serializer, który wie, jak odczytywać i zapisywać dany typ w strumieniu, oraz wartości defaultValue używanej, gdy plik jest pusty.
object UserSettingsSerializer : Serializer<UserSettings> {
override val defaultValue: UserSettings = UserSettings.getDefaultInstance()
override suspend fun readFrom(input: InputStream): UserSettings =
UserSettings.parseFrom(input)
override suspend fun writeTo(t: UserSettings, output: OutputStream) =
t.writeTo(output)
}Tworzenie Proto DataStore
Użyj delegata dataStore (nie preferencesDataStore), przekazując nazwę pliku i swój serializator.
val Context.settingsStore: DataStore<UserSettings> by dataStore(
fileName = "user_settings.pb",
serializer = UserSettingsSerializer
)Odczytywanie typowanych danych
Odczyty odbywają się przez settingsStore.data, ale tym razem typem przepływu jest Twój model. Nie ma kluczy ani rzutowania — wystarczy bezpośredni dostęp do pól.
val darkMode: Flow<Boolean> = context.settingsStore.data
.map { settings -> settings.darkMode }Zapisywanie za pomocą updateData
Proto DataStore zastępuje edit zawieszającą funkcją updateData. Otrzymujesz bieżący obiekt i zwracasz nowy. W przypadku protobuf używasz wygenerowanego buildera.
suspend fun setDarkMode(enabled: Boolean) {
context.settingsStore.updateData { current ->
current.toBuilder()
.setDarkMode(enabled)
.build()
}
}Niemutowalne aktualizacje
Zauważ, że nigdy nie modyfikujesz istniejącego obiektu; tworzysz i zwracasz nowy. Ta niemutowalność zapewnia transakcyjność aktualizacji i spójność danych u wszystkich obserwatorów.
Obsługa uszkodzenia danych
Jeśli przechowywany plik stanie się nieczytelny, DataStore zgłasza CorruptionException. Możesz podać corruptionHandler, który zwróci bezpieczną wartość domyślną zamiast powodować awarię.
val Context.settingsStore by dataStore(
fileName = "user_settings.pb",
serializer = UserSettingsSerializer,
corruptionHandler = ReplaceFileCorruptionHandler {
UserSettings.getDefaultInstance()
}
)Preferences a Proto
Wybór zależy od potrzeb:
- Preferences: kilka niezależnych flag, szybka konfiguracja, brak schematu
- Proto: strukturalny model ustawień, bezpieczeństwo typów, zdefiniowane wartości domyślne
Oba warianty mają tę samą asynchroniczną, transakcyjną podstawę opartą na Flow.
Szybkie sprawdzenie
Sprawdź swoje rozumienie Proto DataStore.
Podsumowanie
Nauczyłeś się przechowywać typowane dane za pomocą Proto DataStore:
- Zdefiniuj schemat, często za pomocą Protocol Buffers
- Zaimplementuj
Serializerwraz zdefaultValue - Utwórz magazyn za pomocą delegata
dataStore - Odczytuj pola bezpośrednio, a zapisuj za pomocą
updateData - Obsłuż uszkodzenie danych za pomocą handlera zwracającego wartość domyślną
Ukończyłeś kurs DataStore.
Często zadawane pytania
Czy lekcja „Proto DataStore” jest bezpłatna?
Tak — pełny tekst „Proto DataStore” 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 „Proto DataStore”?
Przechowuj typowane dane strukturalne Ć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 4 z 4.
Ile czasu zajmuje lekcja „Proto DataStore”?
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