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


77

如何获取所有密钥SharedPreferences,而不是仅将首选项的值作为密钥?

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

1
您是指您的首选项或首选项名称的所有键吗?
Niko 2014年

我的问题是如何获取所有按名称划分的首选项,而不是首选项内的值,因为您可以根据需要设置首选项名称,因此,如果在首选项内创建了多个首选项名而不是值,该怎么办呢?如何获取所有声明的首选项名称。而不是首选项内的首选项值
Piolo Opaw 2014年

Answers:


188

SharedPreferences具有getAll()返回 的方法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());
} 

3
我问谷歌这个问题,并立即指出这个答案,花了我大约2.1秒的时间找到答案。谢谢队友!
SindriÞór16年

1
任何人都知道为什么这有可能引发NullPointerException吗?
Kushan

2
@kushan,地图接受空值。toString可能会导致NPE,这是没有必要的。加号运算符已经处理了toString转换
Blackbelt

16

您可以做的是使用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()实现。



7

Kotlin允许您使用Map只需一行就可以获取所有SharedPreferences键。

干杯

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

4

查看以下代码以获取getAll()方法

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

2

阅读@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(即使不是您在问题中问的内容,也可能对其他读者有用)。


1

尽管@Blackbelt的答案在这里很受欢迎,但我认为它实际上并不是针对这个问题的。(因为问题混合了首选项名称和键的术语,所以这并不令人惊讶。)我想问题是如何找出创建了哪些共享的首选项实例-如果动态创建名称,这将很有意义。

这有两种策略:

  • 创建另一个共享首选项“元”实例,在该实例中,通过将所有键/值对添加到元首选项来注册所有创建的共享首选项实例-该键为共享首选项名称,该值为任何值,例如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 因此您可以在该目录中查找共享首选项文件。但请注意,可能存在不是由您的逻辑创建的共享首选项文件!因此,我会坚持使用第一种方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.