9

例如,如果添加或删除了一些首选项条目,当应用更新为新的首选项结构时,Android 如何处理现有的首选项数据?

我很抱歉这个基本问题,但我勤奋的搜索和阅读无法找到答案。

4

2 回答 2

6

共享首选项存储在文件夹中的 xml 文件中data/data/your.application.package/shared_prefs/。该文件称为your.application.package_preferences.xml

当您检索共享首选项时,您调用Context.getSharedPreferences方法。它创建SharedReferences对象并调用SharedReferences.startLoadFromDisk方法。

如果打开此方法,您将看到带有首选项 ( mFile) 的 xml 文件已被解析,首选项已加载到内存存储 ( map) 中。

BufferedInputStream str = new BufferedInputStream(new FileInputStream(mFile), 16*1024);
map = XmlUtils.readMapXml(str);

从那时起,您将始终从内存中读取您的偏好。更确切地说来自private Map<String, Object> mMap变量。此外,应用程序可以调用startReloadIfChangedUnexpectedly方法,如果底层文件已更改,则会对其进行解析并创建一个新的 HashMap。

关于你的问题,有以下几种情况:

  1. 您在新版本中添加了首选项。然后将返回指定为第二个参数的默认值。注意:属性 android:defaultValue 没有使用,所以要注意。

    String v = (String)mMap.get(key); // not found => v = null

    return v != null ? v : defValue; // return defValue

  2. 您删除了新版本中的首选项。xml 文件和map对象会包含一些冗余数据,但会在用户下次保存首选项时修复。

  3. 您将首选项的键更改为某个未使用的键。然后将返回默认值。结果与第 1 页相同。

  4. 您删除了一个首选项(pref1_key例如,使用键 )并更改了另一个项目的键,以便它引用第一个项目(从pref2_keypref1_key)。然后第二个首选项将具有第一个项目的值。

  5. 您更改了首选项的类型(例如,从 boolean 更改为 int)。然后它会因为这个和类似的代码抛出 CastException (Integer)mMap.get(key);:。但是您可以将例如 EditTextPreference 更改为 ListPreference,因为它们都具有 String 类型。

也许还有一些测试用例,但到目前为止我只做了 5 个。

这里也是带有 ListPreference、EditTextPreference 和 CheckBoxPreference 的首选项文件的示例:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="pref_theme_key">THEME_LIGHT</string>
    <string name="pref_homepage_key">test</string>
    <boolean name="pref_display_name_key" value="true" />
</map>
于 2012-12-29T16:38:17.840 回答
2

当应用更新为新的偏好结构时,Android 如何处理现有的偏好数据?

目前尚不清楚“首选项结构”是什么意思。

您可以将 aSharedPreferences视为持久性HashMap。您将各种值存储在各种键下,以后可以取回它们。在您实际存储某些内容之前,Android 对键或将存储在这些键下的值的类型没有先验知识。

我的猜测是,通过“首选项结构”,您的意思是“XML 中的首选项屏幕定义”。在这种情况下:

  • 如果您添加新的首选项,Android 将正常处理这些首选项,就像这些首选项一直存在但用户之前从未设置过这些首选项一样

  • 如果您删除以前使用过的首选项,旧数据仍然存在,除非您选择删除它,因为 Android 无法知道您将永远不会再次使用该数据

  • 如果您重新键入首选项(即,替换keyAkey1逻辑上相同的首选项),Android 将key1视为一个全新的首选项,因此您需要在代码中的某处放置智能以更新您的SharedPreferences数据以反映密钥改变,如果你愿意

管理首选项“模式版本”并帮助您迁移数据没有任何SharedPreferencesOpenHelper等价物。SQLiteOpenHelper欢迎您创建这样的系统,如果您愿意,如果您觉得它可以帮助您管理经常变化的“偏好结构”。

于 2012-12-29T15:49:06.733 回答