将多个值存储为 SharedPreference 是个好主意吗?

Is it a good idea to store multiple values as SharedPreference?

在我的 android 应用程序中,我有大约 100 个位置(最多 200 个)。我想让用户将每个地方标记为已访问并存储此选择。

所以用户可以mark/unmark他已经访问了一些places/cities。

如果我将值存储为 SharedPreference 是个好主意吗?

我的代码:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("London", "1");
editor.commit(); 

下次当用户标记另一个地方时:

editor.putString("Paris", "1");

我问的是因为那里可能存储的位置很多,在我的情况下最多 200 个。我通常使用这种存储来存储一些设置,但我认为这也是一种存储值的简单方法,我不想使用数据库或任何类似的存储。

SharedPreferences 是一种 key/value 保存数据的方式。我认为保存大量结构化数据是不合适的,因为您必须为您拥有的每个值定义一个键。

对于您的情况,使用 SQLite 可能是更好的选择。

这是否是个好主意取决于您的要求和期望。如果你像这样存储数据,它肯定可以工作,但是会有一些限制:

  • 向用户显示地点列表可能会很复杂。如果您将一些其他数据存储到共享首选项中,您将需要一种方法来区分地点和其他数据。在这种情况下,您可能需要为所有键添加前缀,例如 "place_London"、"place_Paris" 等
  • 您依赖英文键名,因此如果您支持其他语言,您可能会遇到本地化问题
  • 支持版本控制和可伸缩性将更加困难。例如。如果稍后您有一个名为 "Place" 的实体,并且它包含的信息不仅仅是带有标志的名称,那么将其保留在共享首选项中将变得更加困难。例如。如果在某个时候你想为所有地方添加一个相应的国家名称,你会怎么做?

我认为在这种情况下您实际上 DO 想要使用数据库。它会得到回报。

您应该改用更可靠的方式在存储器中存储数据,而不是使用 SharedPreferences。

Sqlite 是不错的选择,但如果您不喜欢编写 SQL Queries 并且想要一个将数据存储在存储器中的解决方案,Realm 是一个了不起的选择。

虽然在实施之前请阅读更多关于使用领域的优缺点。您可以在此处阅读有关 Realm 的更多信息:-

realm.io

Realm vs Room vs ObjectBox