gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:03 25 4
gpt4 key购买 nike

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

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

最佳答案

共享首选项存储在文件夹 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. 您删除了一个首选项(例如,键为 pref1_key)并更改了另一个项的键,使其指向第一个项(从 pref2_keypref1_key)。然后第二个偏好项将具有第一个项的值。

  5. 您更改了首选项的类型(例如,从 bool 值更改为整数)。然后它将抛出 CastException 因为这个和类似的代码:(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 - 当偏好结构在新版本中发生变化时,Android 用户偏好的现有数据会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14083165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com