【问题标题】:Android - Is it bad practice to have multiple Shared Preferences?Android - 拥有多个共享首选项是不好的做法吗?
【发布时间】:2014-03-17 20:35:55
【问题描述】:

我有一个使用SharedPreferences 的应用程序。一个只是存储应用程序版本以检查更新日志的更新,另一个包含一些布局信息,clear() 在用户选择时被调用。我终于设法让PreferenceFragment 工作并注意到一个趋势,所以我想我现在可能会在我疯狂偏好之前问这个问题(尽管我认为我已经足够了)。

我已尽我所能搜索并没有看到具体提到的问题,只是可能有多个问题。

我有点担心PreferenceManager.getDefaultSharedPreferences() 获取错误的首选项,但我可能只是误解了用法。

我能从我的活动中想到的唯一相关代码:

SharedPreferences storedVer = getSharedPreferences(VER_NUM, 0);
SharedPreferences savedLayout = getSharedPreferences(LAYOUT_SAVE, 0);

【问题讨论】:

  • 每个名为 sharedPreference 的文件都会创建一个新的 XML 文件,如果您认为它可以帮助您保持数据更有条理且更易于查找,这并不是一个坏习惯。
  • 啊,谢谢您的确认。我应该担心.getDefaultSharedPreferences() 返回的内容吗?

标签: java android sharedpreferences


【解决方案1】:

这根本不是坏习惯。我认为情况正好相反。我认为不同的行为应该使用不同的sharedPreference 文件。

.getDefaultSharedPreferences() 使用默认的com.company.packagename.xml 文件。其他人创建自己的文件。

我想到了使用多个sharedPreference's 的以下优点。

  • 当您使用 BackupManager 时,您可以提供要备份和恢复的 sharedPreference 文件。
  • 当用户注销时,您可以删除包含该用户私有值的sharedPreference 文件。您可能不想删除其他一些内容。

【讨论】:

  • 感谢.getDefaultSharedPreferences()的解释,调用的时候有点搞不懂是怎么回事。
【解决方案2】:

根据我使用SharedPreferences 的经验,我注意到以下几点:

1) 始终使用 try 使您的 SharedPreference 名称和属性名称在整个设备上都是唯一的。

2) 不要使用SharedPreference 的名称,例如“myPreference”、“preference”、“appPreference”...等。使用您的 PackageName 作为 SharedPreference 名称的唯一标识符。

例子:

SharedPreferences preferences = getSharedPreferences(Context.getPackageName(), Context.MODE_PRIVATE);   

3) 通过将属性名称与包名称连接起来,还可以为您的属性使用唯一的键。

例子:

Editor editor = sharedpreferences.edit();
boolean isAdminKey = Context.getPackageName()+"admin";
editor.putString(isAdminKey , "value");
editor.commit();

4)用一个commit()编辑多个Keys值没问题。

5) 创建首选项时使用MODE_PRIVATE,以防止其他应用程序读取您的SharedPreferences。例如,参见第 2 步

6) 不要依赖SharedPreferences 100%,因为如果用户从应用信息屏幕按下Clear Data 按钮,它将被清除。否则,请在 ExternalDirectory() 中创建文件或将您的信息发送到服务器。

【讨论】:

  • 我认为直接在外部目录中创建文件是不好的做法。当你这样做时,你会堆积用户文件系统和 sd 卡。我有来自各种应用程序的数十个文件夹。我在外部文件系统中使用提供的位置。当用户选择清除数据时,它也会被删除。
  • 另外,当用户要清除数据时,需要清除数据。没有必要阻止它。
  • 我不知道t prefer this, but a lot of famous apps do this like watsapp` 和viber。这种方式将使您的数据远离任何Clear data 操作和Uninstall 操作:) @tasomaniac
  • 大崩溃,听从你的建议似乎是明智的。我选择了一个答案,但有一个赞成票:)
【解决方案3】:

聚会迟到了,但我想说不要使用多个偏好。坚持getDefaultSharedPreferences。我看到很多人无法跟踪保存的首选项的名称。一般来说,它以错误的方式使代码更加复杂(编译器无法帮助您管理您的姓名)。此外,共享首选项适用于少数小值 - 使用文件系统处理大事,使用数据库处理大量数据。

我已经看到命名的共享偏好被大量使用,我相信这是copyPaste()传播的不幸趋势。

最后,您的偏好活动写入默认共享偏好 - 我最近回答了一个问题,如果使用默认偏好,将完全避免。见:Android SharedPreferences not changing

您可以考虑包装默认的共享首选项方法,以使它们更加简洁,就像我所做的那样here

【讨论】:

  • 有趣的一点,@Mr_and_Mrs_D。我可以看到在哪里最小化我的共享首选项的数量是有意义的,并且只有在我真正需要它们时才添加更多,但是就像我说的那样,其中一个首选项会根据用户选择的频率获得clear()call,而我没有知识还没有更好的方法来做到这一点。因此,如果我对所有内容都使用该首选项,我相信它会经常丢失其内容。我考虑过文件系统和数据库选项,但我认为这超出了我的应用程序的范围(至少目前如此)。
  • @ziondreamt:考虑editor.remove("key")
猜你喜欢
  • 2011-11-17
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2013-07-25
相关资源
最近更新 更多