如何遍历共享偏好的所有键?

Posted

技术标签:

【中文标题】如何遍历共享偏好的所有键?【英文标题】:How to iterate through all keys of shared preferences? 【发布时间】:2012-03-07 19:17:31 【问题描述】:

SharedPreferences 具有 getAll 方法,但尽管存在某些键,但它不返回任何条目:

PreferenceManager.getDefaultSharedPreferences(this).contains("addNewAddress");

返回真

Map<String, ?> keys=PreferenceManager.getDefaultSharedPreferences(this).getAll();

返回空地图

怎么了?如何获取所有共享偏好的列表?

【问题讨论】:

【参考方案1】:

你可以做的是使用SharedPreferencesgetAll()方法,并获取Map&lt;String,?&gt;中的所有值,然后你就可以轻松地遍历了。

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

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

有关更多信息,您可以查看PrefUtil.java's dump() 实现。

【讨论】:

这对我没有返回值:( getAll() 可以返回 NULL 值。最好检查 keys 是否为 NULL。 最好使用entry.getValue()而不是entry.getValue().toString()来避免出现NullPointerException)【参考方案2】:

我认为这个问题更多地与为什么

    PreferenceManager.getDefaultSharedPreferences(this).getAll()

返回的是一个空/矛盾的映射,而不是如何迭代标准的 java 映射。 android doc 并不清楚这里发生了什么,但基本上它似乎是 第一次调用

    PreferenceManager.setDefaultValues(this, R.xml.preferences,false)

——当你启动你的应用程序时,你应该调用它来初始化首选项——创建你的首选项的某种缓存版本,这会导致你的 xml 首选项文件的未来更改被不一致地处理,即导致您在问题中描述的不匹配。

要重置此“缓存实体”,请按照以下步骤操作(您可以从上面的链接中找到):

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    prefs.edit().clear();
    PreferenceManager.setDefaultValues(this, R.xml.preferences, true);

【讨论】:

我需要的解决方案是结合这个答案和***.com/a/9310697/1815624【参考方案3】:

如果有人想遍历 KOTLIN 中的共享首选项

 sharedPreferences?.all?.forEach 
     //access key using it.key & value using it.value
     Log.d("Preferences values",it.key() + ": " + it.value()             
 

【讨论】:

【参考方案4】:

在 Kotlin 中非常简单,您可以更改 FILE_PREF_XML 为您的首选项文件

getSharedPreferences("FILE_PREF_XML", Context.MODE_PRIVATE).all?.forEach 
    Log.d(TAG,"shared pref(" + it.key + ") = " + it.value)

【讨论】:

以上是关于如何遍历共享偏好的所有键?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用objective-c在xcode中使用共享偏好? [复制]

共享偏好“限制”

共享偏好 Swift 4- iOS- 唯一 Alamofire 用户 ID

如何使用颤振中的键删除/清除共享首选项?

Android M 奇怪的共享偏好问题

共享偏好? (非常简单的问题!?)