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

时间:2013-03-18 00:13:30

标签: android sharedpreferences

当我最初编写和发布我的应用程序时,我使用自定义书面活动来处理应用程序设置。我使用自定义文件名来存储共享的preferfences,如下所示:

getSharedPreferences("custom_settings_file",MODE_PRIVATE);

但现在我正在重构我的应用,我希望实现PreferenceActivityPreferenceFragment以及带有PreferenceScreen部分的xml文件。我见过的每个教程或示例都在使用

getDefaultSharedPreferences(context);

检索共享首选项,因为PreferenceActivity假定默认文件名存储首选项,并且无法告诉它使用不同的首选项(至少我在一小时的搜索和阅读文档后找不到)。

所以现在我有一个问题。如果我只是简单地使用新的默认文件,我的应用程序的现有用户在更新应用程序时将丢失其设置,因为新应用程序对“custom_settings_file”一无所知。在应用更新中将数据从旧文件移动到新文件的最佳方法是什么?

以下是我可以提出的可能选项:

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

有没有比选项1更好的解决方案?也许某人已经遇到了类似的问题?

3 个答案:

答案 0 :(得分:2)

什么阻止你只做一次1号? 只需在新的共享首选项中添加“migration”布尔值即可。

答案 1 :(得分:2)

如果您还加载了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并处理迁移,那么......我正在写这个,我看到了Nicklas的答案,所以我在这里完成了。

答案 2 :(得分:1)

您是否可以在新的SharedPreferences中添加值,以记录您是新安装还是升级。如果您没有共享首选项中的设置,请检查您以前的方式是否有旧的首选项文件。然后将这些首选项转换为您的新方法,并设置您的私有设置,指示它已升级。然后只需设置指示新状态的新值,您就不需要再检查旧的首选项了。