Android-Programmierung: Shared Preferences
Willemers Informatik-Ecke

Shared Preferences stellen die Möglichkeit dar, primitive Datentypen für den Zugriff innerhalb einer App zu sichern. Die Daten befinden sich persistent im lokalen Bereich der App unter einem Dateinamen und eignen sich dazu einfache Daten beim Wechsel der Activities auszutauschen bzw. zu sichern.

Auch beim Drehen des Displays wird eine Activity gewechselt. Es ist zwar dieselbe Activity-Klasse, aber ein neues Objekt. Auch hier können SharedPreferences eingesetzt werden. Sinnvollerweise sollte die Activity ihre Daten in onPause sichern und in onResume zurückholen.

Die SharedPreferences sind auf primitive Datentypen beschränkt. Damit eignen sie sich besonders für App-Optionen und Einstellungen, daher der Name.

Darüber hinaus ist es auch möglich, String-Mengen aufzunehmen. Allerdings ist diese Fähigkeit mit Vorsicht zu genießen.

Schreiben in SharedPreferences

Zugriff auf SharedPreferences (getSharedPreferences)

Aus einem Context (also aus einer Activity oder einem Fragment) erlangt die Methode getSharedPreferences eine Referenz auf eine SharedPreferences erlangen. Als Parameter erwartet die Methode ...
  1. einen String mit einem eindeutigen Namen, der quasi zum Dateinamen wird.
  2. ein Integer, der die Öffentlichkeit der SharedPreferences angibt. Üblicherweise wird 0 verwendet, was bedeutet, dass die SharedPreferences nur von der eigenen App gelesen und geschrieben werden kann.

Die auch oft noch verwendete Methode getDefaultSharedPreferences ist deprecated. Diese Methode verwendet im Gegensatz zu getSharedPreferences keinen Namen, sondern den Context einer Activity als Parameter.

Schreibvorbereitungen und -abschluss

Für Änderungen benötigen Sie noch ein Objekt der Klasse Editor, das Sie über die Methode edit() erlangen. Die Klasse Editor verfügt über put-Methoden, Daten zu ändern.
SharedPreferences pref = getSharedPreferences("MYAPPKEY", 0);
SharedPreferences.Editor ed = pref.edit();
ed.putInt("PUNKTE", 12);
ed.commit(); // oder ed.apply();
Zum abschließenden Speichern der Daten rufen Sie commit auf, der den Thread bis zum Erfolg blockiert und dann true zurückgibt. Alternativ verwenden Sie apply. Mit dieser Methode läuft der I/O auf einem separaten Thread und blockiert nicht die Anwendung.

Daten ablegen (put-Methoden)

Der erste Parameter jeder put-Methode ist der Schlüssel, über den der Wert später wieder zurückgeholt werden kann.

Der zweite Parameter ist der zu speichernde Wert. Für jeden Datentyp gibt es eine eigene Methode.

SharedPreferences lesen

Um die Werte aus den SharedPreferences zu lesen, wird zunächst wieder eine Referenz auf die SharedPreferences über die Context-Methode getSharedPreferences erlangt.

Über diese Referenz können direkt die get-Methoden aufgerufen werden. Sie liefern die gespeicherten Werte als Rückgabewert zurück.

Als ersten Parameter erwartet eine get-Methode einen String mit dem Schlüssel, unter dem der Wert abgespeichert wurde. Der zweite Parameter stellt den Vorgabewert dar, der zurückgegeben wird, falls der Schlüssel in den SharedPreferences nicht vorhanden ist.

SharedPreferences pref = getSharedPreferences("MYAPPKEY", 0);
int punkte = pref.getInt("PUNKTE", 0);
int high = pref.getBoolean("HIGH", true);
String text = pref.getString("INHALT", "");

Sonderfall String-Set

SharedPreferences können auch String-Sets verarbeiten. Das ist allerdings ein wenig kitzelig. Vor dem Speichern muss der String-Set angelegt werden. Anschließend wird er mit putStringSet gespeichert.
Set<String> stringset = new HashSet<>();
// Füllen des String-Sets
SharedPreferences pref = getSharedPreferences("MYAPPKEY", 0);
SharedPreferences.Editor ed = pref.edit();
ed.putStringSet("MYSET", stringset);
ed.apply();
Vor dem Zurückholen des String-Sets muss dieser angelegt werden und dann mit dem Aufruf von getStringSet befüllt werden.
Set<String> stringset = new HashSet<>();

SharedPreferences pref = getSharedPreferences("MYAPPKEY", 0);
stringset = pref.getStringSet("MYSET", new HashSet<>(););
Der zurückgeholte Set darf nicht modifiziert werden. Darauf weist die Android-Dokumentation explizit hin. Die Konsistenz der Daten ist sonst nicht gewährleistet.