在SQLite数据库和共享首选项之间存储信息的好机制是什么?
为什么要使用共享偏好?为什么要使用sqlite?我试图找出它们之间的区别,哪个是更好的数据存储机制,但我无法在Google上找到合适的答案。请帮我举例和解释。
答案 0 :(得分:146)
这实际上取决于您要存储的数据。
<强> SQLite的强>
大量相同的结构化数据应该存储在SQLite数据库中,因为数据库是为这种数据设计的。由于数据是由数据库构建和管理的,因此可以查询使用SQL等查询语言获取与某些条件匹配的数据子集。这使得可以搜索数据。当然,管理和搜索大量数据会影响性能,因此从数据库读取数据可能比从SharedPreferences读取数据要慢。
<强> SharedPreferences 强>
SharedPreferences是一个键/值存储,您可以在其中保存特定键下的数据。要从商店读取数据,您必须知道数据的密钥。这使得读取数据非常容易。但是,尽管存储和读取大量结构化数据很困难,因为您需要为每个数据定义关键字,但是除了您有一定的概念之外,您无法真正搜索数据。命名键。
答案 1 :(得分:87)
这个问题有一个公认的答案,但我认为在这个话题上还有更多关于速度的说法。
应用程序的SharedPreferences和Sqlite DB都只是文件,存储在设备文件系统的应用程序目录中。如果数据量不是太大,则Sqlite选项将涉及更大,更复杂的文件,并且处理开销更多,以便进行简单访问。
因此,如果数据的性质没有决定您的选择(如接受的答案中所述),并且速度很重要,那么您最好使用SharedPreferences。
阅读一些数据通常是显示主要活动的关键路径所以我认为速度通常非常重要。
关于速度和效率的最后一个想法 - 如果您需要将Sqlite数据库用于某些结构化数据,那么在数据库中存储用户首选项可能更有效,因此您不会打开第二个文件。这是一个相当小的考虑因素 - 只有在您需要访问结构化数据和首选项之后才值得考虑,然后才能显示主要活动。
答案 2 :(得分:14)
我的看法是,它不是关于速度或大小,而是关于您想对数据进行的操作。
如果您打算对数据执行加入,排序,以及其他数据库操作,请转到加入Sqlite 。一个例子是按日期排序数据。
如果要映射简单值(如int,boolean,String),请使用首选项。数据库操作不会在这里工作,不用说你需要拥有所有密钥。一个例子是用户密码或应用程序配置。
拥抱首选项的最大诱惑是当你想用它来将扁平的POJO(一个序列化的JSON对象)存储为String时。有这种需要实际上是使用Sqlite的标志。为什么?因为复杂的数据最终需要复杂的操作。想象一下,检索一个特定的条目,可以通过一个简单的&#34; SELECT ... WHERE id = 1&#34;来处理。在“首选项”路径中,这将是一个从反序列化到迭代结果的漫长过程。
答案 3 :(得分:3)
要存储大量数据,请转到SQLite数据库系统。这个 也将允许用户搜索数据。
另一方面,要存储少量数据,请转到共享 喜好。在这种情况下,不需要庞大的数据库系统。 这将允许用户简单地保存数据并加载它们。
答案 4 :(得分:-7)
忘记SQLLite忘记SharedPreferences,使用Realm。适用于所有本地存储的单一解决方案。您可以使用普通的旧Java对象作为RealmObjects并将数据存储在那里。您可以将选择的查询转换为JSON文件。无需解析整个数据库。 检查此链接: https://realm.io/news/introducing-realm/