【问题标题】:Android Shared Preferences Type MigrationAndroid 共享首选项类型迁移
【发布时间】:2016-10-30 13:42:27
【问题描述】:

如果 Android Preferences 中的 TYPE 偏好改变了怎么办?比如Boolean改成ListPreference

Google 真的没有人考虑过偏好迁移吗?

目前唯一明智的方法似乎是版本偏好和标记删除偏好随着给定版本而改变..?

【问题讨论】:

  • 只是更改首选项名称,为什么不呢?如果是“type_pref”,则调用新的“type_pref1”并忽略以前的

标签: android types migration preference


【解决方案1】:

尝试使用新数据类型读取密钥,以防ClassCastException异常删除“旧”密钥,并创建具有相同名称但新类型的新密钥。像这样的:

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)) ...

【讨论】:

  • 谢谢 :-) 我已经注意到 ClassCastException 作为可能的设置更改/完整性问题的重要性。我也选择删除旧键并使用默认值重新创建它们:-)
【解决方案2】:

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

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

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

标记最近的迁移以供用户查看最近的更改也很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2012-09-20
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多