【问题标题】:Is it possible to get a shared preferences object when only a portion of the name is known?当只知道名称的一部分时,是否可以获得共享首选项对象?
【发布时间】:2015-10-14 21:40:18
【问题描述】:

请注意,这个问题不是关于在不知道键的情况下获取 SharedPreferences 对象的内容,而是关于如果不知道其名称是否可以自己获取 SharedPreferences。

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

我猜没有,但希望有。

除了说需要将应用程序更新为 Marshmallows 权限模型并且它需要能够读取由旧版本应用程序编写的首选项文件,其中首选项名称为是“某事-imsi”。如果用户没有授予 Marshmallow 的相关权限,那么应用程序不知道 imsi,因此我试图找出应用程序在不知道全名时是否可以读取共享首选项。

【问题讨论】:

标签: android android-sharedpreferences


【解决方案1】:

您可以使用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() 中的文件来取得一些进展

【讨论】:

  • OP 询问他是否可以找出存在的不同偏好文件的数量。
  • 谢谢,但问题不在于如何获取 SharedPeferences 对象的内容,而是如何在不知道名称的情况下首先获取该对象。
  • 我现在明白了。正如编辑后的答案所说,这是一个更难的问题。如果你真的有解决问题的动力,请查看 Context.java 的源代码:android.googlesource.com/platform/frameworks/base/+/refs/heads/… 虽然它包含的 getSharedPrefsFile 方法是隐藏的,但可以使用 Java 反射访问它,然后你就可以从那里开始......跨度>
  • 谢谢,我会调查的。
【解决方案2】:

我认为不可能获得可用首选项的文件名列表。虽然如果您知道文件名,那么您可以获得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
    }

【讨论】:

  • 谢谢,但问题不在于如何获取 SharedPeferences 对象的内容,而是如何在不知道名称的情况下首先获取该对象。
猜你喜欢
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
相关资源
最近更新 更多