Przechowywanie danych w aplikacji za pomocą SharedPreferences

Wprowadzone przez użytkownika dane w aplikacji mobilnej mogą być przydatne również po jej wyłączeniu i ponownym uruchomieniu. Wszystkie informacje warto więc gdzieś zapisać. W zależności do naszych potrzeb, możemy to tego celu wykorzystać wbudowaną w system Android bazę danych SQLite lub mechanizm tzw. „udostępnionych preferencji” (ang. Shared prefernces). Czym różnią się oba rozwiązania?

Fot: Blank-Leoneli, CC BY-NC-SA 3.0.

Fot: Blank-Leoneli, CC BY-NC-SA 3.0.

Jeśli w naszej aplikacji potrzebujemy zapisać kilka prostych informacji takich jak np. wprowadzany przez użytkownika tekst, bądź informację o wybranym z menu kolorze interfejsu, to nie ma sensu w takim przypadku wytaczać armaty do zastrzelenia muchy. Specjalnie na potrzeby przechowywania prostych typów danych (boolean, float, int, long, String) został stworzony mechanizm SharedPrefernces, którego zaletą jest między innymi to, że z danych które przechowuje mogą korzystać wszystkie komponenty aplikacji, a co najważniejsze po zamknięciu i ponownym uruchomieniu naszego programu mamy w dalszym ciągu dostęp do zapisanych informacji.

Baza SQLite z kolei służy do przechowywania większych ilości danych, które są znacznie bardziej rozbudowane. Taki sposób zapisywania informacji wprowadzonych przez użytkownika umożliwia nam wykonywanie różnych operacji, takich jak np. sortowanie. Mamy tutaj pełny dostęp do możliwości jakie oferuje język SQL. Co oczywiste taki sposób zapisywania danych wiąże się ze znacznie większym obciążeniem aplikacji.

Oczywiście podane wyżej sposoby na przechowywanie danych w systemie Android to nie jedyne rozwiązania. W zależności od konkretnych wymagań możemy wszystko zaprojektować według własnych potrzeb – np. przechowując dane na zdalnym serwerze. W tym artykule przyjrzymy się jednak w jaki sposób wykorzystać mechanizm udostępnionych preferencji do przechowywania wprowadzanego przez użytkownika tekstu tak aby w momencie przypadkowego wyłączenia aplikacji nie utracił on wyników swojej pracy.

Na czym będziemy pracować?

Na wstępie stworzymy sobie prosty projekt w Android Studio gdzie w głównej aktywności umieszczamy kontrolkę EditText, z której będziemy w dalszej kolejności odczytywać tekst i zapisywać go do SharedPreferences tak aby w momencie w którym użytkownik przypadkowo zamknie aplikację nie utracił on swoich wyników pracy.

Dla osób które chcą robić wszystko od zera wklejam kod MainActivity.java:

Oraz activity_main.xml:

Wersja dla leniwych jest do pobrania tutaj (projekt wykonany w Android Studio 2.2).

Zapis danych do SharedPreferences

Zapis danych przy wykorzystaniu mechanizmu udostępnionych preferencji jest bardzo prosty. Wszystko sprowadza się do utworzenia obiektu typu SharedPreferences gdzie na obiekcie danej aktywności (czyli w naszym przypadku podajemy this, bo kod piszemy w jednej z metod MainActivity) wywołujemy metodę getPreferences(), jako argument podając Context.MODE_PRIVATE.

W ten sposób stworzyliśmy obiekt naszych preferencji na którym (w 2 linijce) wywołujemy metodę edit() i tworzymy nowy obiekt typu SharedPreferences.Editor.

Następnie na nowo utworzonym obiekcie wywołujemy metodę putString() gdzie jako argumenty podajemy unikalną nazwę naszych danych oraz obiekt przechowujący dane (w tym wypadku zmienna typu String) – 3 linijka.

Na koniec wywołujemy metodę commit() aby zakomitować zmiany.

Powyższy kod zgodnie z cyklem życia aktywności umieszczamy w przeładowanej metodzie onPause(), która jest uruchamiana w momencie opuszczenia aplikacji przez użytkownika:

Odczyt danych z SharedPreferences

Aby odczytać zapisane w SharedPreferences dane należy utworzyć obiekt SharedPreferences (analogicznie jak w poprzednim akapicie) i wywołać na nim odpowiednią metodę – w naszym przypadku getString() gdzie jako pierwszy argument podajemy nazwę naszych danych (wpisaną przy ich zapisywaniu) oraz domyślną wartość, która będzie wczytana kiedy nic nie pobierzemy.

Kompletny kod:

Oczywiście powyższy kod zgodnie z cyklem życia aktywności umieszczamy w przeładowanej metodzie onResume(), która wywoływana jest w momencie w którym użytkownik wraca do aplikacji:

Jakie dane możemy przechowywać w SharedPreferences?

Zgodnie z tym co napisałem na początku artykułu w SharedPreferences możemy przechowywać tylko obiekty typu booleanfloatintlongString. Na obiekcie typu SharedPreferences.Editor możemy więc wywołać następujące metody:

Metoda zapisywania danych Metoda odczytywania danych Typ danych
putBoolean() getBoolean() boolean
putFloat() getFloat() float
putInt() getInt() int
putLong() getLong() long
putString() getString() String
putStringSet() getStringSet() Set<String>

Przechowywanie własnego obiektu w SharedPreferences

Jak widać w SharedPreferences możemy przechowywać tylko określone typy obiektów. W jaki więc sposób przechować nasz własny stworzony w aplikacji obiekt (klasę)? Odpowiedź na to pytanie była już poruszana w artykule „Przesyłanie własnego obiektu między Aktywnościami w Androidzie” – cała sztuczka polega na konwersji wybranej klasy do postaci tekstowej co już opisywałem w artykule na temat przesyłania własnego obiektu między aktywnościami w Androidzie. Dalej mamy zwyczajnego Stringa, którego po prostu zapisujemy przy pomocy odpowiednich metod.

, , , , , , , ,