迁移从getSharedPreferences(自定义文件)getDefaultSharedPreferences()

问题描述:

当我最初撰写出版了我的应用程序,我使用的是自定义编写的活动来处理应用程序设置。我使用的自定义文件名存储共享preferfences,像这样:迁移从getSharedPreferences(自定义文件)getDefaultSharedPreferences()

getSharedPreferences("custom_settings_file",MODE_PRIVATE); 

但现在我重构我的应用程序,我想实现PreferenceActivityPreferenceFragmentPreferenceScreen部分的XML文件。每次我见过的教程或例子是使用

getDefaultSharedPreferences(context); 

检索共享偏好,因为PreferenceActivity假设默认文件名存储的偏好,有没有办法告诉它使用一个不同的(至少我做不到找一个小时后搜索并阅读文档)。

所以现在我有一个问题。如果我只是简单地使用新的默认文件,我的应用程序的现有用户在更新应用程序时将失去它们的设置,因为新应用程序不会知道任何关于“custom_settings_file”的信息。在应用更新中将数据从旧文件移动到新文件的最佳方式是什么?

这里是我能想出可能的选项:

  • 扩展Application类和实施的onCreate()的一段代码让每一个我的应用程序启动时,它会检查是否存在“custom_settings_file”并将其内容移至新的内容。但是,在每次启动应用程序时运行代码块似乎都浪费了太多处理资源,只能运行一次。
  • 只需通知用户其旧设置已消失。但显然这是不可接受的。

是否有更好的解决方案,比选1?也许有人已经面临类似的问题?

什么在阻止你做1号只有一次? 只需将“迁移”布尔值添加到新的sharedpreferences即可。

+0

这是一个优雅的解决方案!谢谢。 – 2013-03-18 01:06:43

你能在你的新SharedPreferences增加价值,它记录你是否是一个新的安装或升级。如果您的共享首选项中没有该设置,请检查您是否拥有旧的首选项文件。然后将这些首选项转换为新的方法,并将您的私有设置设置为已升级。然后,只需设置指示新状态的新值,就不再需要检查旧的首选项。

如果您还加载XML预置文件,那么你可以试试这个:

PreferenceManager.setDefaultValues(context, YOUR_PREFERENCE_NAME, MODE_PRIVATE, R.xml.preference_file, false); 

如果不是(你想在你的代码中动态添加的每个首选项),那么你可以这样做:

PreferenceManager pm = getPreferenceManager(); 
pm.setSharedPreferencesMode(MODE_PRIVATE); 
pm.setSharedPreferencesName(YOUR_PREFERENCE_NAME); 

如果你仍然想使用defaultSharedPreference和处理迁移然后......我写这篇文章,我看到尼克拉斯的答案,所以我所做的一切。