Informacje o nowych artykułach oraz akcjach edukacyjnych prosto na Twojej skrzynce e-mail!

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:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = (EditText)findViewById(R.id.editText);
    }

Oraz activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:ems="10"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="134dp"
        android:id="@+id/editText"
        android:hint="Wprowadź tekst..." />
</RelativeLayout>

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.

SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("dane", txt);
editor.commit();

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:

@Override
protected void onPause() {
      super.onPause();

      SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
      SharedPreferences.Editor editor = sharedPref.edit();
      editor.putString("dane", editText.getText().toString());
      editor.commit();
}

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:

SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
String txt = sharedPref.getString("dane", "");

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:

@Override
protected void onResume() {
      super.onResume();

      SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
      txt = sharedPref.getString("dane", ""); // Tekst zapisujemy do zmiennej globalnej i w metodzie OnCreate() przypisujemy do odpowiedniej kontrolki EditText: editText.setText(txt);
}

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 danychMetoda odczytywania danychTyp 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.

Spodobało się?

Jeśli tak, to zarejestruj się do newslettera aby otrzymywać informacje nowych artykułach oraz akcjach edukacyjnych. Gwarantuję 100% satysfakcji i żadnego spamowania!

, , , , , , , ,

Dodaj komentarz

Odpowiedz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Pin It on Pinterest