SQLite和共享首选项的优缺点

Ran*_*a.S 144 database sqlite android data-storage sharedpreferences

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

为何使用共享偏好?为什么要使用sqlite?我试图找出它们之间的区别,哪个是更好的数据存储机制,但我无法在Google上找到合适的答案.请帮我举例和解释.

Flo*_*Flo 154

这实际上取决于您要存储的数据.

SQLite的

大量相同的结构化数据应存储在SQLite数据库中,因为数据库是为这种数据设计的.由于数据是由数据库构建和管理的,因此可以查询使用SQL等查询语言获取与某些条件匹配的数据子集.这使得可以搜索数据.当然,管理和搜索大量数据会影响性能,因此从数据库读取数据可能比从SharedPreferences读取数据要慢.

SharedPreferences

SharedPreferences是一个键/值存储,您可以在其中保存特定键下的数据.要从商店读取数据,您必须知道数据的关键字.这使得读取数据非常容易.但是,尽管存储和读取大量结构化数据很困难,因为您需要为每个数据定义关键字,但是除了您有一定的概念之外,您无法真正搜索数据.命名键.

  • 举一个例子,SharedPreferences对于存储用户首选项很有用,其中只有少数变量需要存储.另一方面,SQLite更适合存储有大量项目的数据,例如音乐库中需要搜索的歌曲标题. (22认同)
  • 仅供参考,有一个第三种选择:读/写XML文件.(参见android.util.xml类).适用于可以一次读/写的中等复杂数据.例如,用户不经常更改的值网格.特别是如果它是您以后可能要发送到其他地方的数据,那么将需要以可解析的格式. (5认同)
  • 您不需要知道使用SharedPreferences的密钥名称.请参阅getAll(). (4认同)
  • 是否建议在共享首选项中将 json 保存为 json 字符串? (2认同)
  • @JCarlos只要你没有做一些跨进程的东西,你就可以使用SharedPreferences了. (2认同)

Tom*_*Tom 90

这个问题有一个公认的答案,但我认为在这个话题上还有更多关于速度的说法.

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

因此,如果数据的性质没有决定您的选择(如接受的答案中所述),并且速度很重要,那么您最好使用SharedPreferences.

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

关于速度和效率的最后一个想法 - 如果您需要将Sqlite数据库用于某些结构化数据,那么在数据库中存储用户首选项可能更有效,因此您不会打开第二个文件.这是一个相当小的考虑因素 - 只有在您需要访问结构化数据和首选项之后才可以值得考虑,然后才能显示主要活动.

  • 伊戈尔,我不同意.SharedPreferences实际上是1维的,使用首选项非常简单.例如,我正在构建一个股票检查应用程序,我只是将股票代码存储在首选项中.我不需要单独抓取它们,因为我总是列出所有这些,这就是我所做的一切,存储或抓取.它比使用DB简单得多,简单得多. (7认同)
  • 代码可读性怎么样?我认为当在SharedPrefs而不是db表中存储多个记录时,代码会变得复杂.Sql语法比在SharedPrefs条目上循环更容易阅读... (5认同)
  • SharedPreferences 只加载到内存一次(每个应用进程生命周期)并保存在那里;之后它总是超级快。因此,将 SharedPref 数据放入 SQLite 并没有真正获得任何实际的性能优势(只是为了避免额外的 SharedPref 文件访问)。顺便说一句,您不应该将 SQLite 内容放入 SharedPrefs 中;正如我所说,它总是在内存中,这可能会给您带来问题(内存不足的问题)。 (3认同)

inm*_*yth 16

我的看法是,它不是关于速度或大小,而是你想要对数据进行的操作.

如果你打算做加盟,排序,和其他操作数据库上的数据,然后去sqlite的.一个例子是按日期排序数据.

如果要映射简单值(如int,boolean,String),请使用Preferences.数据库操作在这里不起作用,不用说你需要拥有所有密钥.一个例子是用户密码或应用程序配置.

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


Sam*_*bar 7

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

  • 另一方面,要存储少量数据,请使用共享首选项。在这种情况下,不需要庞大的数据库系统。这将允许用户简单地保存数据并加载它们。