当只知道名称的一部分时,是否可以获得共享首选项对象?

时间:2015-10-14 21:40:18

标签: android android-sharedpreferences

请注意,如果密钥未知,则此问题不是获取SharedPreferences对象的内容,而是如果其名称未知,是否可以自己获取SharedPreferences。

假设SharedPrefreferences集合中包含“文件名”“something-a”,“something-b”,“something-c”。那么是否可以确定有3组SharedPreferences对象可用,并且当只知道其名称的“某些 - ”部分时能够获取它们?

我想不是,但希望有。

我没有深入了解该要求背后的原因,除非要求将应用程序更新为Marshmallows权限模型,并且它需要能够读取由应用程序的旧版本编写的首选项文件,其中首选项名称是“东西 - imsi”。如果用户未在Marshmallow上授予相关权限,则应用程序不知道imsi,因此我试图找出应用程序在不知道全名时是否可以读取共享首选项。

2 个答案:

答案 0 :(得分:0)

您可以使用SharedPreferences.getAll()检索所有首选项,并迭代此集合以查找与您的模式匹配的字符串键。例如:

SharedPreferences prefs = ctx.getSharedPreferences(PREFS_NAME, 0);
Map<String, ?> pairs = prefs.getAll();
for (Map.Entry<String, ?> entry : pairs.entrySet()) {
    // Check for your string pattern here...
}

此答案假设您有一个共享首选项文件,其中的键与问题中描述的模式匹配。如果不是这种情况,并且您有多个与模式匹配的动态命名的共享首选项文件,则这是一个更难的问题。您可以通过迭代Context.getFilesDir()

中的文件来取得一些进展

答案 1 :(得分:0)

我认为不可能获得首选项的文件名列表。虽然如果您知道文件名,那么您可以获取SharedPreferences的实例并使用getAll方法来获取该组首选项中的所有密钥。

以下是文档: https://developer.android.com/reference/android/content/SharedPreferences.html#getAll()

示例:

    SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, 0);
    Map<String, ?> map = sharedPreferences.getAll();
    for (Map.Entry<String, ?> e : map.entrySet()) {
        String key = e.getKey();
        // this is the key that is present
    }