首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当新版本的偏好结构发生变化时,Android用户偏好的现有数据会发生什么变化?

当新版本的偏好结构发生变化时,Android用户偏好的现有数据会发生什么变化?
EN

Stack Overflow用户
提问于 2012-12-29 23:33:27
回答 2查看 715关注 0票数 9

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

对于这个最基本的问题,我很抱歉,但我勤奋的搜索和阅读都找不到答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-30 00:38:18

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

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

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

代码语言:javascript
复制
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

  • You在新版本中删除了一个首选项。xml文件和map对象将包含一些冗余数据,但当用户下次保存首选项时,它将被修复。

  • 您将首选项的键更改为某个未使用的键。则返回默认值。结果与p.1相同。

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

  • 您更改了首选项的类型(例如,从布尔型更改为整型)。然后,由于下面的代码和类似的代码:(Integer)mMap.get(key);,它将抛出CastException。但您可以将EditTextPreference更改为ListPreference,因为它们都具有字符串类型。

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

下面是包含ListPreference、EditTextPreference和CheckBoxPreference的首选项文件的示例:

代码语言:javascript
复制
<?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>
票数 6
EN

Stack Overflow用户

发布于 2012-12-29 23:49:07

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

不清楚你所说的“偏好结构”是什么意思。

您可以将SharedPreferences看作是一个持久的HashMap。您可以将不同的值存储在不同的键下,稍后可以将它们取回。在你真正存储一些东西之前,Android对这些键下存储的键或值的类型没有先验的知识。

我的猜测是,您所说的“首选项结构”是指“XML格式的首选项屏幕定义”。在这种情况下:

  • 如果你添加了新的首选项,安卓将正常处理这些首选项,就好像这些首选项一直存在,但用户在
  • 之前从未设置过这些首选项如果你删除了之前使用过的首选项,旧数据仍然存在,除非你选择删除它,因为安卓没有办法知道你永远不会再使用这些数据
  • 如果你重新键入一个首选项(也就是用key1替换keyA,得到逻辑上相同的首选项),安卓将把key1视为一个全新的首选项。因此,如果选择

,则需要在代码中的某个位置放置smarts来更新SharedPreferences数据以反映关键更改

没有SQLiteOpenHelperSharedPreferencesOpenHelper等价物来管理首选项“模式版本”并帮助您迁移数据。如果您觉得这样可以帮助您管理频繁变化的“偏好结构”,那么欢迎您创建这样一个系统。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14083165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档