DataStore
Ostatnia aktualizacja | Wersja stabilna | Wersja kandydująca | Wersja Beta | Wersja alfa |
---|---|---|---|---|
26 lutego 2025 r. | 1.1.3 | - | - | - |
Deklarowanie zależności
Aby dodać zależność od DataStore, musisz dodać repozytorium Google Maven do projektu. Więcej informacji znajdziesz w repozytorium Maven firmy Google.
Istnieją 2 implementacje DataStore: Preferences i Proto. Wybierz jeden z tych typów kampanii. Do każdej implementacji możesz też dodać zależności nieobsługujące Androida.
Dodaj zależności dla implementacji, której potrzebujesz, w pliku build.gradle
w aplikacji lub module:
Preferences DataStore
Groovy
// Preferences DataStore (SharedPreferences like APIs) dependencies { implementation "androidx.datastore:datastore-preferences:1.1.3" // optional - RxJava2 support implementation "androidx.datastore:datastore-preferences-rxjava2:1.1.3" // optional - RxJava3 support implementation "androidx.datastore:datastore-preferences-rxjava3:1.1.3" } // Alternatively - use the following artifact without an Android dependency. dependencies { implementation "androidx.datastore:datastore-preferences-core:1.1.3" }
Kotlin
// Preferences DataStore (SharedPreferences like APIs) dependencies { implementation("androidx.datastore:datastore-preferences:1.1.3") // optional - RxJava2 support implementation("androidx.datastore:datastore-preferences-rxjava2:1.1.3") // optional - RxJava3 support implementation("androidx.datastore:datastore-preferences-rxjava3:1.1.3") } // Alternatively - use the following artifact without an Android dependency. dependencies { implementation("androidx.datastore:datastore-preferences-core:1.1.3") }
Proto DataStore
Groovy
// Typed DataStore (Typed API surface, such as Proto) dependencies { implementation "androidx.datastore:datastore:1.1.3" // optional - RxJava2 support implementation "androidx.datastore:datastore-rxjava2:1.1.3" // optional - RxJava3 support implementation "androidx.datastore:datastore-rxjava3:1.1.3" } // Alternatively - use the following artifact without an Android dependency. dependencies { implementation "androidx.datastore:datastore-core:1.1.3" }
Kotlin
// Typed DataStore (Typed API surface, such as Proto) dependencies { implementation("androidx.datastore:datastore:1.1.3") // optional - RxJava2 support implementation("androidx.datastore:datastore-rxjava2:1.1.3") // optional - RxJava3 support implementation("androidx.datastore:datastore-rxjava3:1.1.3") } // Alternatively - use the following artifact without an Android dependency. dependencies { implementation("androidx.datastore:datastore-core:1.1.3") }
Opinia
Twoja opinia pomoże nam ulepszyć Jetpacka. Jeśli zauważysz nowe problemy lub masz pomysły na ulepszenie tej biblioteki, daj nam znać. Zanim utworzysz nowy problem, zapoznaj się z dotychczasowymi problemami w tej bibliotece. Możesz zagłosować na istniejący problem, klikając przycisk z gwiazdką.
Więcej informacji znajdziesz w dokumentacji narzędzia Issue Tracker.
Wersja 1.1
Wersja 1.1.3
26 lutego 2025 r.
androidx.datastore:datastore-*:1.1.3
został zwolniony. Wersja 1.1.3 zawiera te komitowane zmiany.
Poprawki błędów
- Rozwiązaliśmy problem
FileNotFoundException
w wersjiOkioStorage
, który występował podczas uruchamiania aplikacji. Jeśli początkowy odczyt pliku się nie powiedzie, zostanie podjęta druga próba, aby sprawdzić, czy nie wystąpił konflikt spowodowany utworzeniem pliku przez inny proces podczas początkowego odczytu. (I43b3f, b/337870543)
Wersja 1.1.2
15 stycznia 2025 r.
androidx.datastore:datastore-*:1.1.2
został zwolniony. Wersja 1.1.2 zawiera te komitowane zmiany.
Poprawki błędów
- Zmniejszenie opóźnienia odczytu z ciepłej pamięci (
DataStore.data.first()
) o 8 razy. (22b8a40) ReplaceFileCorruptionHandler
można utworzyć na podstawie kodu wspólnego KMP. (7632e839)
Wersja 1.1.1
1 maja 2024 r.
androidx.datastore:datastore-*:1.1.1
został zwolniony. Wersja 1.1.1 zawiera te komity.
Poprawki błędów
- Zmniejszono ryzyko fałszywego alarmu w Linuxie w przypadku błędu „Wystąpiłby impas zasobów”. Wystąpił on, gdy wiele instancji
DataStore
próbowało zapisać dane z różnych procesów, a nie blokowały blokady pliku.
Wersja 1.1.0
17 kwietnia 2024 r.
androidx.datastore:datastore-*:1.1.0
został zwolniony. Wersja 1.1.0 zawiera te komisy.
Główne zmiany od wersji 1.0.0
Aby dowiedzieć się więcej, zapoznaj się z informacjami o wersji 1.1.0 w przypadku wersji alfa i beta. Oto niektóre z głównych zmian w wersji 1.1.0:
- DataStore obsługuje teraz wiele procesów uzyskujących dostęp do tego samego pliku, z obsługą obserwowalności w różnych procesach.
- Nowy interfejs Storage umożliwia dostosowywanie sposobu przechowywania i serializacji modeli danych.
- Teraz możesz używać DataStore w projektach Kotlin Multiplatform.
Wersja 1.1.0-rc01
3 kwietnia 2024 r.
androidx.datastore:datastore-*:1.1.0-rc01
został zwolniony. Wersja 1.1.0-rc01 zawiera te komity.
Poprawki błędów
- Usunięto problem z obniżeniem wydajności, który występował, gdy wywołania
updateData
nie optymalizowały zapisów na dysku, jeśli nowe dane były takie same jak stare (d64cfb5). - Rozwiązaliśmy problem z warunkiem wyścigu, w którym funkcja
MultiProcess
DataStore
mogła pominąć nieważne dane podczas inicjalizacji. ((b/326141553),(094c2dd))
Wersja 1.1.0-beta02
6 marca 2024 roku
androidx.datastore:datastore-*:1.1.0-beta02
został zwolniony. Wersja 1.1.0-beta02 zawiera te komity.
Poprawki błędów
- Ulepszenie skuteczności w przypadku
DataStore
zbiera powiadomienia o aktualizacjach tylko wtedy, gdy je zaobserwujemy. (b/267792241)- Jeśli używasz biblioteki testowania Coroutines, ta zmiana może wywołać błąd
UncompletedCoroutinesError
w testach. Aby uniknąć tego problemu, podczas inicjowaniaDataStore
w testach podaj parametrTestScope.backgroundScope
.
- Jeśli używasz biblioteki testowania Coroutines, ta zmiana może wywołać błąd
- Rozwiązaliśmy problem z zablokowaniem się pętli wywołań
updateData
w tym samym wystąpieniu. (b/241760537) - Funkcja
DataStore
nie powoduje już błęduIOExceptions
, jeśli nie uda się usunąć elementuSharedPreferences
podczas migracji. (b/195553816) - Rozwiązaliśmy problem, który powodował niepowodzenie operacji zmiany nazwy pliku podczas
updateData
w środowiskach JVM innych niż Android. (b/203087070) - Rozwiązaliśmy problem polegający na tym, że
CorruptionException
nie jest obsługiwany po inicjalizacjiDataStore
. (b/289582516)
Wersja 1.1.0-beta01
10 stycznia 2024 r.
androidx.datastore:datastore-*:1.1.0-beta01
jest publikowany bez zmian od 1.1.0-alpha07
. Wersja 1.1.0-beta01 zawiera te commity.
Wersja 1.1.0-alpha07
29 listopada 2023 r.
androidx.datastore:datastore-*:1.1.0-alpha07
został zwolniony. Wersja 1.1.0-alpha07 zawiera te commity.
Zmiany w interfejsie API
- Metody
MultiProcessDataStoreFactory
nie są już eksperymentalne.Adnotacja@ExperimentalMultiProcessDataStore
została całkowicie usunięta. (Ieee54, I8e607)
Poprawki błędów
- Wdrożenie usunięcia adnotacji
@ExperimentalMultiProcessDataStore
w wersji 1.1.0-alpha07. (I8e607)
Wersja 1.1.0-alpha06
1 listopada 2023 roku
androidx.datastore:datastore-*:1.1.0-alpha06
został zwolniony. Wersja 1.1.0-alpha06 zawiera te commity.
Zmiany w interfejsie API
- Metoda fabryczna
createSingleProcessCoordinator
otrzymuje teraz ścieżkę do pliku (String
,java.io.File
iokio.Path
), aby była zgodna z metodącreateMultiProcessCoordinator
. (I211c8, b/305755935)
Wersja 1.1.0-alpha05
6 września 2023 r.
androidx.datastore:datastore-*:1.1.0-alpha05
został zwolniony. Wersja 1.1.0-alpha05 zawiera te commity.
Zmiany w interfejsie API
- Datastore
FileStorage
jest teraz dostępny publicznie, więc klienci mogą podawać parametry niestandardowe. (Icb985) - Zmieniono konstruktor
OkioStorage
tak, aby przyjmował parametrInterProcessCoordinator
, dzięki czemu można go używać na Androidzie zMultiProcessCoordinator
. (Iecea3)
Poprawki błędów
- Rozwiązanie:
MultiProcessCoordinator
nie można monitorować wielu plików w tym samym katalogu. - Rozwiązanie problemu polegające na tym, że nie można wykryć plików, jeśli ścieżki do nich nie są znormalizowane.
- Napraw nieprawidłowe wartości zwracane przez funkcję
RxDataStore#isDisposed
. - Napraw brak konfiguracji Proguarda dla artefaktu
datstore-preferences-core
.
Wersja 1.1.0-alpha04
5 kwietnia 2023 r.
androidx.datastore:datastore-*:1.1.0-alpha04
został zwolniony. Wersja 1.1.0-alpha04 zawiera te commity.
Poprawki błędów
- Ulepszona implementacja wewnętrzna, która zapobiega sytuacji, w której przepływ danych
DataStore
może po aktualizacji emitować starszą wartość.
Wersja 1.1.0-alpha03
24 marca 2023 r.
androidx.datastore:datastore-*:1.1.0-alpha03
został zwolniony.
Poprawki błędów
- Usunięto ograniczenia zależności z artefaktów Maven, aby obejść problem z tworzeniem w przypadku docelowych platform natywnych Kotlina (b/274786186, KT-57531).
Wersja 1.1.0-alpha02
22 marca 2023 r.
androidx.datastore:datastore-*:1.1.0-alpha02
został zwolniony. Wersja 1.1.0-alpha02 zawiera te commity.
Uwaga
Ta wersja zawiera ważną wewnętrzną zmianę, która łączy implementacje DataStore dla pojedynczego procesu i dla wielu procesów. Obserwuj ewentualne niezamierzone zmiany w zachowaniu (np. czas wyświetlania powiadomień o aktualizacjach). Aby zgłosić takie zmiany, możesz użyć modułu śledzenia problemów.
Nowe funkcje
- Możesz teraz używać
DataStore
w projektach KMM. Pamiętaj, że wersje DataStore na platformy inne niż Android są nadal eksperymentalne, ale postanowiliśmy połączyć wersje, aby ułatwić deweloperom ich wypróbowanie. - Funkcje wieloprocesowe zostały przeniesione z
androidx.datastore.multiprocess
doandroidx.datastore.core
. - Dodaj nową metodę fabryki w
androidx.datastore.core.MultiProcessDataStoreFactory
, aby tworzyć instancje DataStore z obiektmiStorage
na potrzeby operacji na plikach. - Dodaliśmy nowy interfejs
InterProcessCoordinator
, który ułatwia komunikację między wieloma instancjami DataStore w różnych procesach. Pamiętaj, że implementacjaInterProcessCoordinator
w wielu procesach jest dostępna tylko na Androidzie.
Zmiany w interfejsie API
- Dodawanie
InterProcessCoordinator
doStorageConnection
w interfejsie datastore-core (I555bb) - Zmień interfejsy API w bibliotece
MultiProcessDataStoreFactory
, aby korzystać z Storage. (Iac02f) - Przenoszenie publicznych interfejsów API z datastore-multiprocess do datastore-core (I76d7c)
- Wyeksponowano
PreferencesSerializer
z datastore-preferences-core (I4b788). - Dodawanie adnotacji
@JvmDefaultWithCompatibility
(I8f206)
Wersja 1.1.0-alpha01
9 listopada 2022 r.
androidx.datastore:datastore-*:1.1.0-alpha01
został zwolniony. Wersja 1.1.0-alpha01 zawiera te commity.
Nowe funkcje
- Obsługa przypadków użycia z wieloma procesami, w których spójność danych jest gwarantowana w
DataStore
instancjach w różnych procesach. DodajMultiProcessDataStoreFactory#create
, aby utworzyć takie instancjeDataStore
. - Nowy interfejs miejsca na dane, który umożliwia przełączanie mechanizmu podstawowego miejsca na dane dla usługi
Datastore
. Dostępne są implementacje dla java.io i okio. FabrykiDataStore
mają nowe metody, które akceptują ten obiekt Storage.
Zmiany w interfejsie API
- Zmień interfejsy API w bibliotece
MultiProcessDataStoreFactory
, aby korzystać z Storage. (Iac02f) - Przenoszenie publicznych interfejsów API z datastore-multiprocess do datastore-core (I76d7c)
- Wyeksponowano
PreferencesSerializer
z datastore-preferences-core (I4b788).
Wersja 1.0.0
Wersja 1.0.0
4 sierpnia 2021 r.
androidx.datastore:datastore-*:1.0.0
został zwolniony. Wersja 1.0.0 zawiera te zatwierdzenia.
Najważniejsze funkcje wersji 1.0.0
Jetpack DataStore to rozwiązanie do przechowywania danych, które umożliwia przechowywanie par klucz-wartość lub typowanych obiektów za pomocą buforów protokołów. DataStore używa coroutines i Flow w języku Kotlin do asynchronicznego, spójnego i transakcyjnego przechowywania danych.
Wersja 1.0.0-rc02
21 lipca 2021 r.
androidx.datastore:datastore-*:1.0.0-rc02
został zwolniony. Wersja 1.0.0-rc02 zawiera te zatwierdzenia.
Poprawki błędów
- Wyjaśnij, że
SharedPreferencesMigration
nie działa, jeśli nie ma kluczy. (Icfa32, b/192824325) - Naprawiono błąd polegający na tym, że
SharedPreferencesMigration
utworzony za pomocąMIGRATE_ALL_KEYS
wywoływał wyjątek, jeśli żądany klucz jeszcze nie istniał. (Ie318a, b/192824325)
Wersja 1.0.0-rc01
30 czerwca 2021 r.
androidx.datastore:datastore-*:1.0.0-rc01
został zwolniony. Wersja 1.0.0-rc01 zawiera te zatwierdzenia.
Poprawki błędów
- Poprawiono błąd polegający na tym, że plik .java został przypadkowo dodany do końcowego pliku jar (I65d96, b/188985637).
Wersja 1.0.0-beta02
16 czerwca 2021 r.
androidx.datastore:datastore-*:1.0.0-beta02
został zwolniony. Wersja 1.0.0-beta02 zawiera te zatwierdzenia.
Poprawki błędów
- Rozwiązanie problemu
ClassVerificationFailure
(b/187450483)
Wersja 1.0.0-beta01
21 kwietnia 2021 r.
androidx.datastore:datastore-*:1.0.0-beta01
został zwolniony. Wersja 1.0.0-beta01 zawiera te commity.
Zmiany w interfejsie API
- Usuń przeciążenia JVM dla metod tylko w języku Kotlin (I2adc7)
Poprawki błędów
- Naprawiono błąd, który powodował wyciek kontekstów w przypadku delegowanych funkcji bazy danych (Ie96fc, b/184415662).
Wersja 1.0.0-alpha08
10 marca 2021 r.
androidx.datastore:datastore-*:1.0.0-alpha08
został zwolniony. Wersja 1.0.0-alpha08 zawiera te zatwierdzenia.
Zmiany w interfejsie API
- Teraz możesz dodać migrację zależną od kontekstu do obiektu delegowanego
dataStore
ipreferencesDataStore
. (I4ef69, b/173726702) - Dodaje funkcje pomocnicze do pobierania nazwy pliku, jeśli nie używasz już interfejsu sterującego bazy danych lub funkcji context.createDataStore (I60f9a).
- Serializer writeTo i readFrom są teraz zawieszone. Jeśli zaimplementujesz serializator, musisz zaktualizować swoje funkcje, aby były to funkcje zawieszania. (I1e58e)
- Dodano obiekty zastępcze dla użytkowników RxDataStore. (Ied768, b/173726702)
Poprawki błędów
- Wdrożenie ograniczeń dotyczących publicznego używania eksperymentalnych interfejsów API (I6aa29, b/174531520)
Wersja 1.0.0-alpha07
24 lutego 2021 r.
androidx.datastore:datastore-*:1.0.0-alpha07
został zwolniony. Wersja 1.0.0-alpha07 zawiera te commity.
Zmiany w interfejsie API
Funkcja rozszerzenia
Context.createDataStore
została usunięta i zastąpiona delegatem właściwości globalDataStore. Zawołaj globalDataStore raz na najwyższym poziomie w pliku kotlin. Przykład:val Context.myDataStore by dataStore(...)
Umieść go na najwyższym poziomie pliku kotlin, aby istniał tylko jeden jego egzemplarz. (I57215, b/173726702)
Funkcje RxDataStore są teraz dostępne w klasie RxDataStore, a nie jako funkcje rozszerzenia w klasie DataStore. (Idccdb, b/177691248)
Jeśli chcesz przenieść EncryptedSharedPreferences (lub bezpośrednie dane SharedPreferences) do DataStore, możesz to zrobić za pomocą nowego konstruktora SharedPreferencesMigration, który umożliwia wstrzyknięcie SharedPreferences. (I8e04e, b/177278510)
Poprawki błędów
- Jeśli dla tego samego pliku jest więcej aktywnych obiektów DataStore, DataStore będzie teraz wyrzucać wyjątek. Jeśli nie zarządzasz DataStore jako Singleton lub nie dbasz o to, aby nie było jednocześnie aktywnych 2 instancji DataStore dla jednego pliku, możesz teraz zobaczyć wyjątki podczas odczytu lub zapisu do DataStore. Można je rozwiązać, zarządzając DataStore jako Singletonem. (Ib43f4, b/177691248)
- Poprawka zachowania anulowania, gdy zakres rozmówcy został anulowany. (I2c7b3)
Wersja 1.0.0-alpha06
13 stycznia 2021 r.
androidx.datastore:datastore-*:1.0.0-alpha06
został zwolniony. Wersja 1.0.0-alpha06 zawiera te commity.
Nowe funkcje
- Dodano owijacze RxJava dla DataStore. Elementy
datastore-rxjava2/3
zawierają obudowy dla podstawowych interfejsów DataStore API (RxDataStore
,RxDataStoreBuilder
iRxDataMigration
). Elementydatastore-preferences-rxjava2/3
zawierają konstruktor do tworzenia interfejsu DataStore preferencji.
Zmiany w interfejsie API
- Ukryj interfejs CorruptionHandler. Nie było powodu, aby była publiczna, ponieważ fabryka DataStore akceptuje tylko ReplaceFileCorruptionHandler. (I0b3b3, b/176032264)
- Metoda
preferencesKey<T>(name: String): Key<T>
została usunięta i zastąpiona metodami specyficznymi dla każdego obsługiwanego typu. Na przykładpreferencesKey<Int>("int")
to terazintPreferencesKey("int")
(Ibcfac, b/170311106).
Poprawki błędów
- Poprawiono dokumentację klasy DataStoreFactory, w której nie uwzględniono faktu, że plik bazy danych jest tworzony w podkatalogu „datastore/”. (Ica222)
Wersja 1.0.0-alpha05
2 grudnia 2020 r.
androidx.datastore:datastore-*:1.0.0-alpha05
został zwolniony. Wersja 1.0.0-alpha05 zawiera te zatwierdzenia.
Poprawki błędów
- Dodanie lepszej dokumentacji i wyjątków dotyczących jednoczesnych zapisów z baz danych. (Ia98a2, b/173522155, b/173726702)
- Teraz zezwalamy (ale nie wymagamy) zamykania strumienia wyjściowego przekazywanego do
Serializer.writeTo()
. (I5c9bf, b/173037611)
Wersja 1.0.0-alpha04
17 listopada 2020 r.
androidx.datastore:datastore-*:1.0.0-alpha04
został zwolniony. Wersja 1.0.0-alpha04 zawiera te commity.
Poprawki błędów
- Naprawiono problem z pakowaniem, który powodował ten błąd w danych preferencji:
1.0.0-alpha03
:java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/datastore/preferences
- Awaria została pierwotnie zgłoszona tutaj: b/173036843
- (I4712d, b/173036843)
Wersja 1.0.0-alpha03
11 listopada 2020 roku
androidx.datastore:datastore-*:1.0.0-alpha03
został zwolniony. Wersja 1.0.0-alpha03 zawiera te commity.
Nowe funkcje
- Ustawienia obsługują teraz wartości podwójne (co jest przydatne, jeśli potrzebujesz większej precyzji niż liczby zmiennoprzecinkowe) (I5be8f, b/169471808)
Zmiany w interfejsie API
- Utworzono czystą zależność Kotlina od Datastore, aby umożliwić szybszą kompilację.
androidx.datastore:datastore-core
zawiera podstawowe interfejsy API tylko dla Kotlina, aandroidx.datastore:datastore
zawiera interfejsy API zależne od Androida (w tym konstruktorSharedPreferencesMigration
iContext.createDataStore
). (I42d75, b/168512698) - Wyodrębnienie celów dla magazynu danych preferencji w celu przyspieszenia kompilacji Kotlina (Ia3c19)
Serwery serializujące wymagają teraz nowej właściwości dla wartości domyślnej, która będzie używana, jeśli na dysku nie ma żadnych danych. Ułatwia to implementację niestandardowych serializatorów, dzięki czemu użytkownicy nie muszą traktować inaczej pustych strumieni wejściowych (puste strumienie wejściowe nie są parsowane za pomocą json).
- Dodano też sprawdzanie, czy strumień wyjściowy przekazany do metody writeTo() nie jest zamknięty. Jeśli tak, to wyrzuca wyjątki (I16e29).
Uczynienie konstruktora SharedPreferencesView wewnętrznym. Początkowo była publiczna, aby umożliwić testowanie. Testy powinny zamiast tego tworzyć obiekt SharedPreferencesMigration i na jego podstawie przeprowadzać testy. (I93891)
Poprawki błędów
- Parametr
produceFile
w funkcjachDataStoreFactory
iPreferenceDataStoreFactory
jest teraz ostatnim parametrem na liście, co umożliwia użycie składni funkcji lambda na końcu w języku Kotlin. (Ibe7f1, b/169425442) - Postępowanie zgodnie z nowymi wymaganiami dotyczącymi interfejsu API w Kotlinie (I5ae1e)
Znane problemy
- Magazyn danych preferencji ulega awarii w przypadku
java.lang.NoClassDefFoundError
. (b/173036843)
Wersja 1.0.0-alpha02
14 października 2020 r.
androidx.datastore:datastore-core:1.0.0-alpha02
i androidx.datastore:datastore-preferences:1.0.0-alpha02
są dostępne. Wersja 1.0.0-alpha02 zawiera te commity.
Poprawki błędów
- Dodano zabezpieczenie przed mutacją w bibliotece danych. Mutacja powoduje przerwanie korzystania z magazynu danych przez osoby korzystające z magazynu danych z typami innymi niż proto czy preferencje (I6aa84)
- Dodano metodę
toString
do pliku Preferences.kt, aby ułatwić debugowanie bieżącego stanu (I96006). - Dodano wyjątek, aby chronić przed niewłaściwym użyciem
DataStore.Preferences
(I1134d) - Usunięto błąd powodujący awarię aplikacji podczas uruchamiania (I69237, b/168580258)
Wersja 1.0.0-alpha01
2 września 2020 r.
androidx.datastore:datastore-core:1.0.0-alpha01
i androidx.datastore:datastore-preferences:1.0.0-alpha01
są dostępne. Wersja 1.0.0-alpha01 zawiera te commity.
Nowe funkcje
Jetpack DataStore to nowe i ulepszone rozwiązanie do przechowywania danych, które ma zastąpić SharedPreferences. Biblioteka DataStore korzysta z co-routines i Flow w Kotlinie, a dzięki temu oferuje 2 różne implementacje:
- Proto DataStore, który umożliwia przechowywanie typowanych obiektów (obsługiwanych przez bufory protokołu).
- preferencji, która przechowuje pary klucz-wartość;
Dane są przechowywane asynchronicznie, spójnie i transakcyjnie, co eliminuje większość wad SharedPreferences.