Wie bekomme ich alle Schlüssel von SharedPreferences programmgesteuert in Android?


75

Wie bekomme ich alle Schlüssel rein SharedPreferences, nicht nur den Wert der Voreinstellung?

prefA = getSharedPreferences("MyAttack", MODE_PRIVATE);
prefB= getSharedPreferences("MySkill", MODE_PRIVATE);

1
Meinen Sie alle Schlüssel Ihrer Präferenzen oder die Präferenznamen?
Niko

Meine Frage ist, wie Sie alle Einstellungen erhalten, die Sie nach Namen dekaliert haben, nicht nach dem Wert dessen, was in den Einstellungen enthalten ist, da Sie den Präferenznamen festlegen können, wenn Sie möchten. Was ist also, wenn Sie viele Präferenznamen erstellen, die keinen Wert innerhalb der Präferenz haben? Problem So erhalten Sie alle deklarierten Präferenznamen. nicht die Präferenzwerte innerhalb der Präferenz
Piolo Opaw

Antworten:


185

SharedPreferenceshat die Methode getAll(), die a zurückgibt Map<String, ?>. Auf der Karte können Sie einfach die Schlüssel mit keySet()und die Schlüssel- / Wertzuordnungen abrufen mit entrySet():

Map<String, ?> allEntries = prefA.getAll();
for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
    Log.d("map values", entry.getKey() + ": " + entry.getValue().toString());
} 

3
Ich habe Google nach dieser Frage gefragt und wurde sofort auf diese Antwort hingewiesen. Ich brauchte ungefähr 2,1 Sekunden, um die Antwort zu finden. Danke Kumpel!
Sindri Þór

1
Weiß jemand, warum dies das Potenzial hat, eine NullPointerException auszulösen?
Kushan

2
@kushan, map akzeptiert Nullwerte. toString kann eine NPE verursachen und ist nicht erforderlich. Der Plus-Operator kümmert sich bereits um die toString-Konvertierung
Blackbelt

16

Was Sie tun können, ist die getAll () -Methode von SharedPreferences zu verwenden und alle Werte in Map abzurufen. Anschließend können Sie sie einfach durchlaufen:

Map<String,?> keys = prefs.getAll();

for(Map.Entry<String,?> entry : keys.entrySet()){
    Log.d("map values",entry.getKey() + ": " + entry.getValue().toString());            
}

Weitere Informationen finden Sie in der dump () - Implementierung von PrefUtil.java über diesen Link .


16

Verwenden Sie die Methode getAll () von android.content.SharedPreferences.

Map<String, ?> map = sharedPreferences.getAll();

7

Mit Kotlin können Sie mithilfe von Map alle Ihre SharedPreferences-Schlüssel mit nur einer Zeile abrufen .

Prost Kumpel 🎉

val sharedPreferences = context.getSharedPreferences("SHARED_PREFERENCES", Context.MODE_PRIVATE)
val sharedPreferenceIds = sharedPreferences.all.map { it.key } //returns List<String>

4

Überprüfen Sie den folgenden Code für die getAll()Methode

Map<String, ?> prefsMap = prefA.getAll();
for (Map.Entry<String, ?> entry: prefsMap.entrySet()) {
    Log.v("SharedPreferences", entry.getKey() + ":" + 
entry.getValue().toString());
}

2

Nachdem ich die @ Delacrix-Antwort gelesen und mit dem Kotlin-Weg (getestet in Kotlin 1.3.11) zum Abrufen der Schlüssel gespielt hatte, fand ich eine noch kürzere Version heraus, um die Schlüssel (oder sogar die Werte) zu erhalten:

val prefsA = context.getSharedPreferences("MyAttack", Context.MODE_PRIVATE)
val prefsAIDs = sharedPreferences.all.keys //returns MutableSet<String>

Auf die gleiche Weise können Sie nur über auf die Werte zugreifen sharedPreferences.all.values(auch wenn dies nicht das ist, was Sie in Ihrer Frage gestellt haben, kann dies für andere Leser nützlich sein).


1

Obwohl die Antwort von @ Blackbelt hier sehr beliebt ist, denke ich, dass sie nicht wirklich auf die Frage abzielt. (Es ist nicht überraschend, da die Frage die Terminologie von Präferenznamen und -schlüsseln verwechselt.) Ich denke, die Frage ist, wie man herausfindet, welche Instanzen für gemeinsame Präferenzen erstellt wurden - was von Interesse sein kann, wenn die Namen dynamisch erstellt werden.

Hier sind zwei Strategien dafür:

  • Erstellen Sie eine weitere "Meta" -Instanz für gemeinsame Einstellungen, in der alle erstellten Instanzen für gemeinsam genutzte Einstellungen registriert werden, indem Sie den Meta-Einstellungen ein Schlüssel / Wert-Paar hinzufügen. Der Schlüssel ist der Name der freigegebenen Einstellungen und der Wert ist ein beliebiger Wert, z true.

    getSharedPreferences( DYNAMIC_PREFS_NAME, 0 )
        .edit().put*(*).apply();
    getSharedPreferences( "meta_prefs_index", 0 )
        .edit().putBoolean( DYNAMIC_PREFS_NAME, true).apply();
    

    Verwenden Sie die Meta-Einstellungen und folgen Sie der Antwort von @Blackbelt, um alle von Ihnen erstellten gemeinsamen Einstellungen zu erhalten.

  • Freigegebene Einstellungen verfügen über eine Sicherungsdatei, die in einem Ordner /data/data/YOUR_PACKAGE_NAME/shared_prefsmit dem Namen gespeichert ist. YOUR_PREFS_NAME.xml Sie können also in diesem Verzeichnis nach Ihren freigegebenen Voreinstellungsdateien suchen. Aber seien Sie vorsichtig, es kann gemeinsame Einstellungsdateien geben, die nicht von Ihrer Logik erstellt wurden! Deshalb würde ich beim ersten Ansatz bleiben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.