例如,如果添加或删除了一些首选项条目,当应用更新为新的首选项结构时,Android 如何处理现有的首选项数据?
我很抱歉这个基本问题,但我勤奋的搜索和阅读无法找到答案。
例如,如果添加或删除了一些首选项条目,当应用更新为新的首选项结构时,Android 如何处理现有的首选项数据?
我很抱歉这个基本问题,但我勤奋的搜索和阅读无法找到答案。
共享首选项存储在文件夹中的 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。
关于你的问题,有以下几种情况:
您在新版本中添加了首选项。然后将返回指定为第二个参数的默认值。注意:属性 android:defaultValue 没有使用,所以要注意。
String v = (String)mMap.get(key); // not found => v = null
return v != null ? v : defValue; // return defValue
您删除了新版本中的首选项。xml 文件和map
对象会包含一些冗余数据,但会在用户下次保存首选项时修复。
您将首选项的键更改为某个未使用的键。然后将返回默认值。结果与第 1 页相同。
您删除了一个首选项(pref1_key
例如,使用键 )并更改了另一个项目的键,以便它引用第一个项目(从pref2_key
到pref1_key
)。然后第二个首选项将具有第一个项目的值。
(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>
当应用更新为新的偏好结构时,Android 如何处理现有的偏好数据?
目前尚不清楚“首选项结构”是什么意思。
您可以将 aSharedPreferences
视为持久性HashMap
。您将各种值存储在各种键下,以后可以取回它们。在您实际存储某些内容之前,Android 对键或将存储在这些键下的值的类型没有先验知识。
我的猜测是,通过“首选项结构”,您的意思是“XML 中的首选项屏幕定义”。在这种情况下:
如果您添加新的首选项,Android 将正常处理这些首选项,就像这些首选项一直存在但用户之前从未设置过这些首选项一样
如果您删除以前使用过的首选项,旧数据仍然存在,除非您选择删除它,因为 Android 无法知道您将永远不会再次使用该数据
如果您重新键入首选项(即,替换keyA
为key1
逻辑上相同的首选项),Android 将key1
视为一个全新的首选项,因此您需要在代码中的某处放置智能以更新您的SharedPreferences
数据以反映密钥改变,如果你愿意
管理首选项“模式版本”并帮助您迁移数据没有任何SharedPreferencesOpenHelper
等价物。SQLiteOpenHelper
欢迎您创建这样的系统,如果您愿意,如果您觉得它可以帮助您管理经常变化的“偏好结构”。