1

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

getSharedPreferences("custom_settings_file",MODE_PRIVATE);

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

getDefaultSharedPreferences(context);

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

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

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

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

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

4

3 回答 3

2

是什么阻止你只做一次第一?只需在新的共享首选项中添加一个“迁移”布尔值。

于 2013-03-18T00:55:43.033 回答
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 的答案,所以我在这里完成了。

于 2013-03-18T01:04:23.177 回答
1

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

于 2013-03-18T00:57:20.067 回答