Подтвердить что ты не робот

Как получить все ключи SharedPreferences программно в Android?

Как получить все ключи в SharedPreferences, а не только значение ключа предпочтения?

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

Ответ 1

SharedPreferences имеет метод getAll(), который возвращает a Map<String, ?>. На карте вы можете легко получить ключи с помощью keySet() и сопоставления клавиш/значений с помощью entrySet():

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

Ответ 2

Что вы можете сделать, это использовать метод getAll() SharedPreferences и получить все значения в Map, а затем вы можете легко выполнить итерацию через них:

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

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

Более того, вы можете проверить реализацию PrefUtil.java dump() с помощью этой .

Ответ 3

Используйте метод getAll() для android.content.SharedPreferences.

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

Ответ 4

Ознакомьтесь с приведенным ниже кодом для метода getAll()

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

Ответ 5

Kotlin позволит вам получить все ваши ключи SharedPreferences одной строкой с помощью карты.

Ура, приятель 🎉

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

Ответ 6

Хотя ответ @Blackbelt довольно популярен, я думаю, что на самом деле он не затрагивает вопрос. (Это не удивительно, так как вопрос смешивает терминологию имен предпочтений и ключей.) Я предполагаю, что вопрос заключается в том, как определить, какие экземпляры общих предпочтений были созданы, что может представлять интерес, если имена создаются динамически.

Вот две стратегии для этого:

  • создать дополнительный экземпляр "meta" общих предпочтений, в котором все созданные экземпляры совместно используемых префайлов регистрируются путем добавления пары "ключ/значение" для метафайлов в метафайлы - с ключом, являющимся общим именем prefences, и значением является любое значение например true.

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

    Чтобы получить все общие предварительные настройки, созданные вами, используйте мета-префы и следуйте ответам @Blackbelt.

  • общие настройки имеют файл резервной копии, который хранится в папке /data/data/YOUR_PACKAGE_NAME/shared_prefs с именем YOUR_PREFS_NAME.xml Таким образом, вы можете просмотреть этот каталог для файлов ваших общих предпочтений. Но будьте осторожны, могут быть файлы общих предпочтений, которые не были созданы вашей логикой! Поэтому я бы придерживался первого подхода.

Ответ 7

Прочитав ответ @Delacrix и поигравшись с Kotlin-способом (проверенным в Kotlin 1.3.11) получения ключей, я обнаружил еще более короткую версию для получения ключей (или даже значений):

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

Точно так же вы можете получить доступ только к значениям через sharedPreferences.all.values (даже если это не то, что вы задали в своем вопросе, может быть полезно для других читателей).