Preferences Verständnisfrage...

  • 2 Antworten
  • Letztes Antwortdatum
kleinerkathe

kleinerkathe

Dauer-User
242
Ich verwende SharedPreferences für einfache Key-Value-Paare.

Jetzt hab ich einmal SharedPreferences verwendet um die Einstellungen des Users zu speichern und einmal um mir intern ein paar handvoll Daten zu speichern.

Wenn ich jetzt bei meiner Hauptactivity, die ein paar Werte der Usereinstellungen braucht, das
Code:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        prefs.edit().clear();
        PreferenceManager.setDefaultValues(this, R.xml.pref_general, false);
aufrufe.

Und später um meine KeyValue-Paare zu verwalten das hier verwende:
Code:
public long getLocalTimestamp(String preferenceName){
        SharedPreferences sharedPref = BaseActivity.context.getSharedPreferences(PREFERENCE_LITTLE_FILES, Context.MODE_PRIVATE);
        long localTimestamp = sharedPref.getLong(preferenceName, [B]0[/B]);
        return localTimestamp;
    }

    public void setTimestamp(String preferenceName, long timestamp){
        SharedPreferences sharedPref = BaseActivity.context.getSharedPreferences(PREFERENCE_LITTLE_FILES, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putLong(preferenceName, timestamp);
        editor.commit();
  }

  1. Warum wird mir nach Neustart der App(die die Methode aufruft um zu schauen wie der "timestamp" der lokalen Dateien ist) immer wieder der Default-Wert "0" ausgespuckt?
  2. Die beiden Preferences legen doch unabängig voneinander ihre xml-Dateien an oder kommt sich da was in die Quere? (das überprüf ich heut abend selbst, wenn ich wieder ein Gerät mit Root in den Fingern hab)
  3. Wie speicher ich ansonsten elegant 3 verschiedene Zahlen, welche nach Appneustart immer noch vorhanden sein sollen?

Wenn ich direkt nach setTimestamp("timestamp1", 1780000) ein getTimestamp("timestamp1") ausführe, zeigt er mir 1780000 an ... Aber er wird nicht "richtig" gespeichert ...

Der ursprüngliche Beitrag von 09:38 Uhr wurde um 10:29 Uhr ergänzt:

So, hat sich direkt erledigt ... Hab durch Copy&Paste immer den Timestamp 0 gesetzt wenn auf das Backup zurückgegriffen wurde.
Ebenso sollte man (so stands auf SO) die gewünschte Bezeichnung des Preference-File direkt angeben, sondern immer per static final ...
Naja jetzt tuts, ich hab was dazugelernt ... Passt also :p

Antwort zu 2. Ja scheint unabhängig voneinander zu sein ...
Antwort zu 3. Man könnte noch ne DB anlegen, aber das finde ich für Key-Value-Paare erheblich oversized.
 
Zuletzt bearbeitet:
Dein Problem ist zwar gelöst, allerdings will ich noch folgendes loswerden:

Anstatt editor.commit(); sollte lieber editor.apply(); verwendet werden.

Ich schreibe das deshalb, weil ich mit editor.commit(); öfters Probleme in der Vergangenheit Probleme hatte, da Werte einfach nicht übernommen wurden. Nach kurzem googlen habe ich herausgefunden, dass ich nicht der einzigste mit diesem Problem war und die Lösung des Problems ganz einfach ist: .apply(); zu benutzen statt .commit();

Vielleicht hilft das ja in Zukunft jemanden

Mit freundlichen Grüßen
 
Danke, das hatte ich auch noch gefunden :) commit liefert ein boolean ob der Aufruf erfolgreich war oder nicht. Apply speichert die "Speichern"-Anfrage in einer Queue und speichert dann die Preference wenn "Zeit" dazu da ist ...
 
Zurück
Oben Unten