迁移从getSharedPreferences(自定义文件)getDefaultSharedPreferences()
当我最初撰写出版了我的应用程序,我使用的是自定义编写的活动来处理应用程序设置。我使用的自定义文件名存储共享preferfences,像这样:迁移从getSharedPreferences(自定义文件)getDefaultSharedPreferences()
getSharedPreferences("custom_settings_file",MODE_PRIVATE);
但现在我重构我的应用程序,我想实现PreferenceActivity
或PreferenceFragment与PreferenceScreen
部分的XML文件。每次我见过的教程或例子是使用
getDefaultSharedPreferences(context);
检索共享偏好,因为PreferenceActivity假设默认文件名存储的偏好,有没有办法告诉它使用一个不同的(至少我做不到找一个小时后搜索并阅读文档)。
所以现在我有一个问题。如果我只是简单地使用新的默认文件,我的应用程序的现有用户在更新应用程序时将失去它们的设置,因为新应用程序不会知道任何关于“custom_settings_file”的信息。在应用更新中将数据从旧文件移动到新文件的最佳方式是什么?
这里是我能想出可能的选项:
- 扩展
Application
类和实施的onCreate()的一段代码让每一个我的应用程序启动时,它会检查是否存在“custom_settings_file”并将其内容移至新的内容。但是,在每次启动应用程序时运行代码块似乎都浪费了太多处理资源,只能运行一次。 - 只需通知用户其旧设置已消失。但显然这是不可接受的。
是否有更好的解决方案,比选1?也许有人已经面临类似的问题?
什么在阻止你做1号只有一次? 只需将“迁移”布尔值添加到新的sharedpreferences即可。
你能在你的新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
和处理迁移然后......我写这篇文章,我看到尼克拉斯的答案,所以我所做的一切。
这是一个优雅的解决方案!谢谢。 – 2013-03-18 01:06:43