当新版本中的首选项结构发生变化时,Android用户首选项的现有数据会发生什么变化?

时间:2012-12-29 15:33:27

标签: android preferences updates

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

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

2 个答案:

答案 0 :(得分:6)

共享首选项存储在文件夹data/data/your.application.package/shared_prefs/中的xml文件中。该文件名为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. 您已将首选项的键更改为某些未使用的键。然后将返回默认值。与p.1。

  4. 相同的结果
  5. 您删除了一个首选项(例如,使用键pref1_key)并更改了另一个项的键,以便它引用第一个项(从pref2_key到{{1 }})。然后第二个首选项将具有第一个项的值。

  6. 您更改了首选项的类型(例如,从布尔值更改为int)。然后它将抛出CastException,因为这个和类似的代码:pref1_key。但是您可以将EditTextPreference更改为ListPreference,因为它们都具有String类型。
  7. 也许还有更多的测试案例,但到目前为止,我只编写了5个。

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

    (Integer)mMap.get(key);

答案 1 :(得分:2)

  

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

目前还不清楚你的意思是&#34;偏好结构&#34;。

您可以将SharedPreferences视为持久性HashMap。您可以在各种键下存储各种值,稍后可以将它们取回。 Android没有先验知道密钥或将存储在这些密钥下的值的类型,直到您实际存储某些内容。

我的猜测是&#34;偏好结构&#34;,你的意思是&#34; XML中的首选项屏幕定义&#34;。在那种情况下:

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

  • 如果您删除之前使用过的偏好设置,旧数据仍会保留,除非您选择删除它,因为Android无法知道您将永远不再使用该数据

    < / LI>
  • 如果您重新键入偏好设置(例如,将keyA替换为key1以获得逻辑相同的偏好设置),Android会将key1视为全新的偏好设置,所以如果您选择

  • ,您需要将代码中的智能放在某处以更新SharedPreferences数据以反映关键更改

没有SharedPreferencesOpenHelper等效的SQLiteOpenHelper来管理偏好&#34;架构版本&#34;并帮助您迁移数据。如果您愿意,欢迎您创建这样一个系统,如果您认为它可以帮助您管理频繁变化的偏好结构&#34;。