如何在Android中以编程方式获取SharedPreferences的所有键?

88

如何获取 SharedPreferences 中的所有键,而不是仅限首选项值的键?

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

1
你是指你的偏好设置中的所有键还是偏好设置的名称? - Niko
我的问题是如何获取所有按名称声明的首选项,而不是首选项内部值的值,因为您可以根据需要设置首选项名称。那么,如果您创建了许多首选项名称而不是首选项内部的值,则问题在于如何获取所有声明的首选项名称,而不是首选项内部的首选项值。 - Piolo Opaw
7个回答

206

SharedPreferences有一个getAll()方法,返回一个Map<String, ?>类型的对象。通过这个Map对象,你可以轻松地使用keySet()方法获取键的集合以及使用entrySet()方法获取键值对的集合:

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

4
我询问了谷歌这个问题,很快就找到了这个答案,只用了大约2.1秒钟。谢谢伙计! - Sindri Þór
1
有人知道为什么这可能会引发NullPointerException吗? - Kushan
2
@kushan,map接受null值。toString可能会导致NPE,而且也不是必需的。加号运算符已经处理了toString转换。 - Blackbelt

19
您可以使用SharedPreferences的getAll()方法获取所有值并将它们存储在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()实现。


提供的 Google Code 链接似乎无法使用。不过,有另一个库非常适合扩展日志记录:https://github.com/elvishew/xLog - Nah

15

使用 android.content.SharedPreferencesgetAll() 方法。

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

8
使用Map,Kotlin可以让您只用一行代码获取所有SharedPreferences键。
干杯,伙计。
val sharedPreferences = context.getSharedPreferences("SHARED_PREFERENCES", Context.MODE_PRIVATE)
val sharedPreferenceIds = sharedPreferences.all.map { it.key } //returns List<String>

5

请查看以下代码中 getAll() 方法的内容。

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

5

阅读 @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 访问值(尽管这不是您在问题中提出的内容,但对其他读者可能会有用)。

2
尽管@Blackbelt的回答在这里很受欢迎,但我认为它实际上并没有针对问题。 (这并不奇怪,因为问题混淆了首选项名称和键的术语。)我猜测问题是如何找出已创建哪些共享首选项实例 - 如果名称是动态创建的,则可能会引起兴趣。
以下是两种策略:
  • create another shared preferences "meta" instance where all created shared prefences instances are registered by adding a key/value pair for it to the meta prefs - with the key being the shared prefences name and the value being any value e.g. true.

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

    To obtain all shared prefences created by you, use the meta prefs and follow the answer of @Blackbelt.

  • shared preferences have a backup file, which is stored in folder /data/data/YOUR_PACKAGE_NAME/shared_prefs with name YOUR_PREFS_NAME.xml So you can look into that directory for your shared preferences files. But be careful, there might be shared preferences files that were not created by your logic! Therfore I would stick with the first approach.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接