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

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

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

Solutions Collecting From Web of "当新版本中的偏好结构发生变化时,Android用户偏好的现有数据会发生什么变化?"

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

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

如果你打开这个方法,你将会看到带有首选项( mFile )的xml文件被parsing并且首选项被加载到内存存储器( map )中。

 BufferedInputStream str = new BufferedInputStream(new FileInputStream(mFile), 16*1024); map = XmlUtils.readMapXml(str); 

从那以后,你将永远从内存中读取你的喜好。 更确切地说来自private Map<String, Object> mMapvariables。 此外,应用程序可以调用startReloadIfChangedUnexpectedly方法,如果底层文件已被更改,将被parsing并创build一个新的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. 您更改了一个首选项的types(例如,从布尔值为int)。 然后它会抛出CastException,因为这个和类似的代码: (Integer)mMap.get(key); 。 但是,您可以将EditTextPreference更改为ListPreference,因为它们都具有Stringtypes。

也许还有更多的testing用例,但到目前为止,我只有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如何处理现有的首选项数据?

目前还不清楚“偏好结构”是什么意思。

你可以把SharedPreferences想象成一个持久化的HashMap 。 您可以在各种键下存储各种值,稍后可以取回。 Android没有关键的先验知识或将被存储在这些关键字下的值的types,直到你实际存储了一些东西。

我的猜测是,“偏好结构”是指“XML中的偏好屏幕定义”。 在这种情况下:

  • 如果您添加了新的偏好设置,则Android会正常处理这些偏好设置,就像偏好已经一直存在一样,但用户从未设置过偏好

  • 如果您删除之前使用过的偏好设置,则旧数据将保留,除非您select将其删除,因为Android无法知道您将永远不会再使用该数据

  • 如果你重新input一个首选项(比如用key1replacekey1的逻辑是相同的首选项),Android会把key1视为一个全新的首选项,所以你需要在你的代码中放置智能来更新你的SharedPreferences数据以反映关键的变化,如果你这样select

没有SharedPreferencesOpenHelper等效于SQLiteOpenHelper来pipe理首选项“模式版本”并帮助您迁移数据。 如果您愿意,您可以创build这样一个系统,如果您觉得它会帮助您pipe理经常变化的“偏好结构”。