Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从GetSharedReferences(自定义文件)迁移到GetDefaultSharedReferences()_Android_Sharedpreferences - Fatal编程技术网

Android 从GetSharedReferences(自定义文件)迁移到GetDefaultSharedReferences()

Android 从GetSharedReferences(自定义文件)迁移到GetDefaultSharedReferences(),android,sharedpreferences,Android,Sharedpreferences,当我最初编写并发布我的应用程序时,我使用一个自定义的编写活动来处理应用程序设置。我使用自定义文件名存储共享首选项Fence,如下所示: getSharedPreferences("custom_settings_file",MODE_PRIVATE); PreferenceManager pm = getPreferenceManager(); pm.setSharedPreferencesMode(MODE_PRIVATE); pm.setSharedPreferencesName(YOUR

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

getSharedPreferences("custom_settings_file",MODE_PRIVATE);
PreferenceManager pm = getPreferenceManager();
pm.setSharedPreferencesMode(MODE_PRIVATE);
pm.setSharedPreferencesName(YOUR_PREFERENCE_NAME);
但现在我正在重构我的应用程序,我想实现PreferenceActivity或,并使用PreferenceScreen部分实现一个xml文件。我看到的每个教程或示例都在使用

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

所以现在我有个问题。如果我只是简单地使用新的默认文件,我的应用程序的现有用户在更新应用程序时将丢失其设置,因为新应用程序将不知道有关自定义\u设置\u文件的任何信息。在应用程序更新时,将数据从旧文件移动到新文件的最佳方式是什么

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

扩展应用程序类并在onCreate中实现一段代码,这样每次启动我的应用程序时,它都会检查是否存在自定义设置文件,并将其内容移动到新文件中。但在每次应用程序启动时运行一段代码似乎浪费了太多的处理资源,而操作只需要运行一次。 只需通知用户他们的旧设置已消失。但这显然是不可接受的。
有没有比选项1更好的解决方案?也许有人已经遇到了类似的问题?

什么阻止你只做一次第一件事?
只需在新的SharedReferences中添加一个迁移布尔值。

是什么阻止您只执行一次数字1?
只需在新的SharedReferences中添加一个迁移布尔值。

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

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

如果您还加载了xml首选项文件,则可以尝试以下操作:

PreferenceManager.setDefaultValues(context, YOUR_PREFERENCE_NAME, MODE_PRIVATE, R.xml.preference_file, false);
如果不希望在代码中动态添加每个首选项,则可以执行以下操作:

getSharedPreferences("custom_settings_file",MODE_PRIVATE);
PreferenceManager pm = getPreferenceManager();
pm.setSharedPreferencesMode(MODE_PRIVATE);
pm.setSharedPreferencesName(YOUR_PREFERENCE_NAME);

如果您仍然希望使用DefaultSharedReference并处理迁移,那么。。。我正在写这篇文章,我看到了Nicklas的答案,所以我在这里结束了

如果同时加载xml首选项文件,则可以尝试以下操作:

PreferenceManager.setDefaultValues(context, YOUR_PREFERENCE_NAME, MODE_PRIVATE, R.xml.preference_file, false);
如果不希望在代码中动态添加每个首选项,则可以执行以下操作:

getSharedPreferences("custom_settings_file",MODE_PRIVATE);
PreferenceManager pm = getPreferenceManager();
pm.setSharedPreferencesMode(MODE_PRIVATE);
pm.setSharedPreferencesName(YOUR_PREFERENCE_NAME);

如果您仍然希望使用DefaultSharedReference并处理迁移,那么。。。我正在写这篇文章,我看到了Nicklas的答案,所以我在这里结束了

这是一个优雅的解决方案!谢谢。这是一个优雅的解决方案!非常感谢。