2 komentarze

SharedPreferences – zapisywanie danych aplikacji

Sierpień 5, 2011 Content Providers Podstawowe komponenty Przechowywanie danych Tutoriale

SharedPreferences jest klasą, która dostarcza nam lekkiego dla systemu mechanizmu pozwalającego na przechowywanie niewielkich ilości danych. Z założenia mechanizm ten powinien przechowywać informacje o ustawieniach interfejsu, aplikacji itp. Jego ograniczeniem jest obsługa tylko prostych typów danych (boolean, float, int, long, String). Natomiast zaletą tego mechanizmu jest współdzielenie danych pomiędzy wszystkimi komponentami aplikacji. Dane oczywiście są przechowywane nawet po ponownym uruchomieniu naszego programu.

Przykładowa aplikacja

Stworzymy teraz niewielką aplikację, która pozwoli nam na przechowanie danych pola tekstowego pomiędzy jej kolejnymi uruchomieniami.

Przygotowania

Interfejs aplikacji będzie złożony z pola tekstowego oraz przycisku służącego do zapisywania danych. Oto kod źródłowy Aktywności z dwoma metodami wymagającymi implementacji:

public class MainActivity extends Activity {
	private EditText etToSave;
	private Button btnSave;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		etToSave = (EditText) findViewById(R.id.etToSave);
		btnSave = (Button) findViewById(R.id.btnSave);
		initButtonOnClick();
		restoreData();
	}

	private void initButtonOnClick() {
		btnSave.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				saveData();
				showToast("Data saved");
			}
		});
	}

	private void showToast(String msg) {
		Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
	}
}

Obsługa SharedPreferences

Zaczniemy od dostarczenia odpowiednich pól do naszej Aktywności:

public class MainActivity extends Activity {
	private static final String PREFERENCES_NAME = "myPreferences";
	private static final String PREFERENCES_TEXT_FIELD = "textField";
	private EditText etToSave;
	private Button btnSave;

	private SharedPreferences preferences;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		preferences = getSharedPreferences(PREFERENCES_NAME, Activity.MODE_PRIVATE);
		etToSave = (EditText) findViewById(R.id.etToSave);
		btnSave = (Button) findViewById(R.id.btnSave);
		initButtonOnClick();
		restoreData();
	}

	private void initButtonOnClick() {
		btnSave.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				saveData();
				showToast("Data saved");
			}
		});
	}

	private void showToast(String msg) {
		Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
	}
}

W linijce 24 następuje inicjalizacja obiektu SharedPreferences, odbywająca się za pomocą metody Aktywności – getSharedPreferences(String name, int mode). Przyjmuje ona dwa parametry:

  • Nazwę pliku, w których przechowywane są ustawienia
  • Tryb w jakim ma być otwarty plik z naszymi ustawieniami (MODE_PRIVATE jest domyślnym trybem, który dostęp do naszych ustawień daje tylko aplikacji, która się do nich odnosi).

Uwaga – istnieje również druga metoda Aktywności dająca dostęp do ustawień – getPreferences(). Tworzy ona plik ustawień dla konkretnej Aktywności. Przydaje się wtedy gdy potrzebujemy zapisywać dane tylko jednego okna aplikacji i nie mamy zamiaru ich współdzielić.

Zapisywanie danych

Zapisywanie danych jako SharedPreferences odbywa się za pomocą klasy SharedPreferences.Editor. Cały proces sprowadza się do 3 kroków:

  1. otwórz edytor (metoda edit() obiektu SharedPreferences),
  2. wpisz dane (metody put…() obiektu SharedPreferences.Editor – argumentami są klucz i wartość),
  3. zapisz zmiany (metoda commit() obiektu SharedPreferences.Editor).

Tak prezentuje się to w naszym przykładzie:

	private void saveData() {
		SharedPreferences.Editor preferencesEditor = preferences.edit();
		String editTextData = etToSave.getText().toString();
		preferencesEditor.putString(PREFERENCES_TEXT_FIELD, editTextData);
		preferencesEditor.commit();
	}

Odczytywanie danych

Proces odczytywania danych jest jeszcze prostszy. Wystarczy bowiem skorzystać z metod get…() wywoływanych na obiekcie SharedPreferences. Przyjmują one dwa parametry – klucz oraz wartość domyślną na wypadek gdyby pod danym kluczem nie występowała żadna wartość.

	private void restoreData() {
		String textFromPreferences = preferences.getString(PREFERENCES_TEXT_FIELD, "");
		etToSave.setText(textFromPreferences);
	}

I w tym momencie zakończyliśmy pracę z naszym przykładem prezentującym działanie SharedPreferences.

Działanie, zrzuty ekranu

Podczas pierwszego uruchomienia naszej aplikacji zapisujemy przykładowy tekst:

Po ponownym uruchomieniu aplikacji ujrzymy:

Kompletny kod źródłowy

Cały projekt dostępny jest na naszym githubie – HelloSharedPreferences.

MainActivity.java

package pl.froger.hellosharedpreferences;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
	private static final String PREFERENCES_NAME = "myPreferences";
	private static final String PREFERENCES_TEXT_FIELD = "textField";
	private EditText etToSave;
	private Button btnSave;

	private SharedPreferences preferences;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		preferences = getSharedPreferences(PREFERENCES_NAME, Activity.MODE_PRIVATE);
		etToSave = (EditText) findViewById(R.id.etToSave);
		btnSave = (Button) findViewById(R.id.btnSave);
		initButtonOnClick();
		restoreData();
	}

	private void initButtonOnClick() {
		btnSave.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				saveData();
				showToast("Data saved");
			}
		});
	}

	private void saveData() {
		SharedPreferences.Editor preferencesEditor = preferences.edit();
		String editTextData = etToSave.getText().toString();
		preferencesEditor.putString(PREFERENCES_TEXT_FIELD, editTextData);
		preferencesEditor.commit();
	}

	private void restoreData() {
		String textFromPreferences = preferences.getString(PREFERENCES_TEXT_FIELD, "");
		etToSave.setText(textFromPreferences);
	}

	private void showToast(String msg) {
		Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
	}
}

Komentarze (2) Subskrybuj

 

  1. [...] z klasy SharedPreferences do zapisania ustawień w bieżącym profilu, korzystając z tutoriala SharedPreferences – zapisywanie danych aplikacji | android4devs -tworze sobie plik xml w którym są zapisane ustawienia [...]

Prześlij komentarz

Zaloguj się lub skorzystaj z profilu:

[rpxlogin redirect="http://www.android4devs.pl" prompt="" style="large"]

Możesz również zostawić komentarz bez rejestracji, korzystając z poniższego formularza:

Musisz być zalogowany aby móc pisać komentarze.