例如,如果添加或删除了一些首选项条目,那么当使用新的首选项结构更新应用程序时,Android如何处理现有的首选项数据?
我很抱歉这个基本问题,但我勤奋的搜索和阅读无法找到答案。
答案 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。
关于你的问题,有以下几种情况:
您在新版本中添加了首选项。然后将返回指定为第二个参数的默认值。注意:未使用属性android:defaultValue,因此请注意。
String v = (String)mMap.get(key); // not found => v = null
return v != null ? v : defValue; // return defValue
您删除了新版本中的首选项。 xml文件和map
对象将包含一些冗余数据,但是当用户下次保存首选项时,它将被修复。
您已将首选项的键更改为某些未使用的键。然后将返回默认值。与p.1。
您删除了一个首选项(例如,使用键pref1_key
)并更改了另一个项的键,以便它引用第一个项(从pref2_key
到{{1 }})。然后第二个首选项将具有第一个项的值。
pref1_key
。但是您可以将EditTextPreference更改为ListPreference,因为它们都具有String类型。也许还有更多的测试案例,但到目前为止,我只编写了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;。