SQLite 和共享首选项的利弊

在 SQLite 数据库和共享首选项之间存储信息的好机制是什么?

为什么要使用共享偏好?为什么要用 sqlite?我试图找出它们之间的区别,以及哪种是更好的数据存储机制,但我无法在谷歌上找到合适的答案。请帮我举例说明。

78795 次浏览

它实际上取决于要存储的数据。

SQLite

大量相同的结构化数据应该存储在 SQLite 数据库中,因为数据库是为这类数据设计的。由于数据是由数据库进行结构化和管理的,因此可以使用 SQL 等查询语言对数据进行查询,以获得符合特定条件的数据子集。这使得在数据中进行搜索成为可能。当然,管理和搜索大量数据集会影响性能,因此从数据库中读取数据比从 SharedPreferences 中读取数据要慢。

共享偏好

SharedPreferences 是一个键/值存储,您可以在其中将数据保存在某个键下。要从存储中读取数据,您必须知道数据的键。这使得读取数据非常容易。但是,存储少量数据很容易,存储和读取大型结构化数据很困难,因为你需要为每个单独的数据定义键,此外,你不能真正在数据中搜索,除非你有一个命名键的特定概念。

这个问题有一个公认的答案,但我认为有更多的话题说-关于速度。

应用程序的 SharedPreferences 和 Sqlite DB 都只是文件,存储在设备文件系统上的应用程序目录中。如果数据量不太大,Sqlite 选项将涉及更大、更复杂的文件,并且为简单访问带来更多的处理开销。

因此,如果数据的性质并不决定您的选择(正如已接受的答案所解释的那样) ,而且速度很重要,那么您可能最好使用 SharedPreferences。

读取一些数据通常是显示主要活动的关键路径,所以我认为速度通常是非常重要的。

关于速度和效率的最后一个想法——如果您需要使用 Sqlite 数据库来处理一些结构化数据,那么在数据库中存储用户首选项可能更有效,这样您就不会打开第二个文件。这是一个相当次要的考虑因素——可能只有在您需要在显示主要活动之前同时访问结构化数据和首选项时才值得考虑。

我的看法是,这不是关于速度或大小,而是你想对你的数据进行什么样的操作。

如果你计划在你的数据上做 加入排序和其他数据库操作,那么去做 Sqlite。例如,按日期对数据进行排序。

如果您想映射简单的值(如 int、 boolean、 String) ,那么使用 偏好。DB 操作在这里不起作用,更不用说你需要拥有所有的密钥。一个例子是用户密码或应用程序配置。

接受 Preferences 的最大诱惑是当您想要使用它将一个扁平的 POJO (一个序列化的 JSON 对象)存储为 String 时。有这样的需求实际上是使用 Sqlite 的标志。为什么?因为复杂的数据最终需要复杂的操作。想象一下,检索一个特定的条目,它可以由一个简单的“ SELECT... WHERE id = 1”来处理。在 Preferences 路径中,从反序列化到迭代结果将是一个漫长的过程。

  • 要存储大量数据,请使用 SQLite 数据库系统 将允许用户搜索数据

  • 另一方面,为了存储少量数据,可以使用 Shared 在这种情况下,没有必要使用庞大的数据库系统。 这将允许用户简单地保存数据并加载它们。

忘记 SQLLite 忘记 SharedPreferences,使用 Domain。所有本地存储的单一解决方案。您可以使用普通的旧 Java 对象作为 RealmObjects 并将数据存储在那里。您可以将选定的查询转换为 JSON 文件。不需要解析整个数据库。 点击这个链接: Https://realm.io/news/introducing-realm/