Android共享首选项类型迁移

时间:2016-10-30 13:42:27

标签: android types migration preference

如果Android偏好设置中的首选项类型发生了变化,该怎么办?例如,如果Boolean更改为ListPreference

Google真的没有想过Preference Migrations吗?

现在唯一合理的方式似乎是版本首选项和标记删除首选项随给定版本而变化..?

2 个答案:

答案 0 :(得分:1)

尝试使用新数据类型读取密钥,如果SharedPreferences prefs; String key = "key"; prefs = PreferenceManager.getDefaultSharedPreferences(this); if (prefs.contains(key)) { // key exists, so tetermine it's type try { prefs.edit().get<old_type_name>(key, <default_old_type_value>); } catch (Exceprtion e) { if (e instanceOf ClassCastException) { prefs.edit().remove(key).apply(); } } } // we are here if no key exists or key removed prefs.edit().put<new_type_name>(key, <new_type_value>).apply(); 异常删除“旧”密钥,并创建具有相同名称但新类型的新密钥。像这样:

if (prefs.contains(key)) ...

如果需要,请在首次启动时检查public static void main(String[] args) { String s = new String("xlactz3Ja8Z/qep6niE="); System.out.println("String: " + s); byte[] b = Base64.getDecoder().decode(s); String res = ""; String aux = new String(); for(byte a : b) { aux = Integer.toBinaryString(255 & a); // If length is less than 8, than add "0" if (aux.length() != 8) { aux = padronize (aux); } res = res + aux + " "; } // Padronize all Substrings to have length 8 private static String padronize (String str) { String aux = ""; // Create a auxiliar string to padronize for (int i = 0; i < 8 - str.length(); i++) { aux += "0"; } return aux + str; } 一次。

答案 1 :(得分:0)

我做了一些适用于原始SharedPreferences并且不需要PreferenceFragment的东西:

  • 介绍了设置版本。
  • 首选项存储在具有专用xml字符串的xml资源中。
  • 拆分代码以加载,迁移,在应用程序启动时设置默认设置。
  • 创建了两个字符串数组版本和密钥 - 跟踪首选项更改 - keys是一个逗号分隔的字符串 - 使用相同的索引,该对保存有关给定版本迁移的信息。
  • 检查存储设置中的当前版本并验证存储在字符串数组中的版本,如果其当前版本较旧(较低的数字),则删除具有相同索引的键字符串数组中提供的键(需要字符串拆分)并重新使用默认值创建它们。

这为我提供了一种很好的设置迁移方式,完全基于字符串xml资源而且没有代码更改,如果用户没有经常更新应用程序,它还应该逐步迁移所有后续版本: - )

最近为最近更改的用户评论标记最近的迁移也很好。