2014-02-18 4 views
14

Ich habe eine App mit SharedPreferences. Man speichert nur die App-Version, um nach einem Update für ein Changelog zu suchen, das andere enthält einige Layout-Informationen, die clear() aufgerufen werden, wenn der Benutzer wählt. Ich schaffte es schließlich, einen PreferenceFragment zu bekommen und bemerkte einen Trend, also dachte ich, ich könnte das jetzt fragen, bevor ich die Vorliebe verrückt mache (obwohl ich denke, dass ich genug habe).Android - Ist es eine schlechte Übung, mehrere gemeinsame Einstellungen zu haben?

Ich habe mein Bestes zu suchen und sehe keine spezifische Erwähnung eines Problems, nur dass es möglich ist, mehrere zu haben.

Ich bin ein wenig besorgt über PreferenceManager.getDefaultSharedPreferences() greifen das falsche Pref, aber ich könnte einfach die Verwendung missverstehen.

Die einzige relevante Code i von meiner Tätigkeit denken konnte:

SharedPreferences storedVer = getSharedPreferences(VER_NUM, 0); 
SharedPreferences savedLayout = getSharedPreferences(LAYOUT_SAVE, 0); 
+5

Jede benannte sharedPreference erstellt eine neue XML-Datei, es ist keine schlechte Praxis, wenn Sie es denken hilft Ihnen, Daten besser zu organisieren und leichter zu finden. –

+0

Ah, danke für die Bestätigung. Sollte ich besorgt sein, was '.getDefaultSharedPreferences()' zurückgibt? – ziondreamt

Antwort

6

Es ist überhaupt keine schlechte Praxis. Ich denke, es ist das Gegenteil. Ich denke, verschiedene Verhaltensweisen sollten verschiedene sharedPreference Dateien verwenden.

.getDefaultSharedPreferences() verwendet die Standarddatei com.company.packagename.xml. Und die anderen erstellen ihre eigenen Dateien.

Die folgenden Vorteile der Verwendung von mehreren sharedPreference's kommen mir in den Sinn.

  • Wenn Sie BackupManager verwenden, können Sie angeben, welche sharedPreference Dateien gesichert und wiederhergestellt werden sollen.
  • Wenn der Benutzer sich abmeldet, können Sie sharedPreference Datei mit diesem Benutzer private Werte löschen. Sie möchten möglicherweise keine anderen löschen.
  • +0

    Danke für die Erklärung von '.getDefaultSharedPreferences()', war ich ein bisschen verwirrt, was los war, als das aufgerufen wurde. – ziondreamt

    2

    Aus meiner Erfahrung mit dem SharedPreferences ich habe folgendes bemerkt:

    1) Verwenden Sie immer versuchen, Ihre SharedPreference zu machen Name und Attribute sind auf dem gesamten Gerät eindeutig.

    2) Verwenden Sie nicht den Namen Ihrer SharedPreference wie "myPreference", "preference", "appPreference" ... etc. Verwenden Sie Ihre PackageName als eindeutige Kennung für den Namen SharedPreference.

    Beispiel:

    SharedPreferences preferences = getSharedPreferences(Context.getPackageName(), Context.MODE_PRIVATE); 
    

    3) Nutzung auch ein eindeutiger Schlüssel für Ihre Attribute durch die Attributnamen mit dem Paketnamen verketten.

    Beispiel:

    Editor editor = sharedpreferences.edit(); 
    boolean isAdminKey = Context.getPackageName()+"admin"; 
    editor.putString(isAdminKey , "value"); 
    editor.commit(); 
    

    4) Kein Problem bei der Bearbeitung mehrerer Schlüssel-Werte mit einem commit().

    5) Verwenden MODE_PRIVATE, wenn Sie Ihre Einstellungen erstellen andere Anwendungen zu verhindern, dass Ihre SharedPreferences lesen. Siehe Schritt 2 zum Beispiel

    6) Verlassen Sie sich nicht auf das SharedPreferences 100%, weil es, wenn der Benutzer gelöscht wird Clear Data Taste aus dem App Info-Bildschirm gedrückt. Andernfalls erstellen Sie die Datei in der ExternalDirectory() oder senden Sie Ihre Informationen an einen Server.

    +2

    Ich denke, das Erstellen von Dateien im externen Verzeichnis ist eine schlechte Übung. Wenn Sie das tun, massen Sie Benutzer Dateisystem und SD-Karte. Ich habe Dutzende von Ordnern aus verschiedenen Anwendungen. Ich verwende den angegebenen Platz im externen Dateisystem. Und es wird auch gelöscht, wenn der Benutzer klare Daten auswählt. – tasomaniac

    +2

    Wenn der Benutzer Daten löschen möchte, sollten die Daten gelöscht werden. Es hat keinen Sinn, es zu stoppen. – tasomaniac

    +0

    Ich bevorzuge das nicht, aber viele bekannte Apps machen das wie 'watsapp' und' viber'. Auf diese Weise können Sie Ihre Daten von jeder 'Clear Data'-Aktion und' Deinstallieren'-Aktion fernhalten. @tasomaniac –

    0

    Spät in die Partei, aber ich würde sagen, nicht mehrere Präferenzen verwenden. Stick mit getDefaultSharedPreferences. Ich habe gesehen, dass viele die Namen der gespeicherten Einstellungen nicht im Auge behalten. Im Allgemeinen macht es den Code auf die falsche Art komplizierter (der Compiler kann Ihnen nicht helfen, Ihre Namen zu verwalten). Darüber hinaus sind gemeinsame Präferenzen für eine Handvoll kleiner Werte - benutze das Dateisystem für große Dinge und eine Datenbank für viele Daten.

    Ich habe gesehen, dass die genannten gemeinsamen Vorlieben sehr häufig verwendet werden, und ich glaube, dass dies ein unglücklicher Trend ist, der durch copyPaste() verbreitet wird.

    Schließlich schreiben Ihre Präferenzaktivitäten in die standardmäßigen gemeinsamen Einstellungen - ich habe kürzlich eine Frage beantwortet, wo dies der Fall war - würden vollständig vermieden, wenn Standardeinstellungen verwendet würden. Siehe: Android SharedPreferences not changing

    Sie sich anschauen sollten die Standard gemeinsamen Präferenzen Methoden Einwickeln, um sie weniger zu machen auch ausführliche, wie ich habe here getan

    +0

    Interessanter Punkt, @Mr_and_Mrs_D. Ich kann sehen, wo das Minimieren meiner Anzahl von geteilten Prefs sinnvoll wäre und nur mehr hinzufügen, wenn ich sie wirklich brauche, aber wie ich sage, bekommt eines der Prefs ein 'clear()', das so oft aufgerufen wird wie der Benutzer wählt und ich nicht habe das Wissen noch von einem besseren Weg, es zu tun. Also, wenn ich dieses Pref für alles verwende, glaube ich, dass es seinen Inhalt ziemlich oft verlieren würde. Ich habe Dateisystem- und Datenbankoptionen in Betracht gezogen, aber ich denke, es ist nur ein wenig außerhalb des Umfangs meiner App (zumindest für den Moment). – ziondreamt

    +1

    @ziondreamt: Betrachte [editor.remove ("Schlüssel")] (http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#remove (java.lang.String)) –

    Verwandte Themen