例如,如果添加或删除了一些首选项条目,当应用程序使用新的首选项结构更新时,Android如何处理现有的首选项数据?
对于这个最基本的问题,我很抱歉,但我勤奋的搜索和阅读都找不到答案。
发布于 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)中。
BufferedInputStream str = new BufferedInputStream(new FileInputStream(mFile), 16*1024);
map = XmlUtils.readMapXml(str);从那时起,你将永远从记忆中读出你的偏好。更确切地说,来自private Map<String, Object> mMap变量。此外,应用程序还可以调用startReloadIfChangedUnexpectedly方法,如果底层文件发生了更改,则会对其进行解析并创建一个新的HashMap。
关于你的问题,有以下几种情况:
String v = (String)mMap.get(key); // not found => v = null
return v != null ? v : defValue; // return defValue
map对象将包含一些冗余数据,但当用户下次保存首选项时,它将被修复。
pref1_key ),并更改了另一个项的键,以便它引用第一个项(从pref2_key到pref1_key)。然后,第二个首选项将具有第一个项的值。
(Integer)mMap.get(key);,它将抛出CastException。但您可以将EditTextPreference更改为ListPreference,因为它们都具有字符串类型。也许还有更多的测试用例,但到目前为止我只做了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-29 23:49:07
当应用使用新的偏好结构更新时,安卓如何处理现有的偏好数据?
不清楚你所说的“偏好结构”是什么意思。
您可以将SharedPreferences看作是一个持久的HashMap。您可以将不同的值存储在不同的键下,稍后可以将它们取回。在你真正存储一些东西之前,Android对这些键下存储的键或值的类型没有先验的知识。
我的猜测是,您所说的“首选项结构”是指“XML格式的首选项屏幕定义”。在这种情况下:
key1替换keyA,得到逻辑上相同的首选项),安卓将把key1视为一个全新的首选项。因此,如果选择,则需要在代码中的某个位置放置smarts来更新SharedPreferences数据以反映关键更改
没有SQLiteOpenHelper的SharedPreferencesOpenHelper等价物来管理首选项“模式版本”并帮助您迁移数据。如果您觉得这样可以帮助您管理频繁变化的“偏好结构”,那么欢迎您创建这样一个系统。
https://stackoverflow.com/questions/14083165
复制相似问题