共享偏好设置的“限制”

52

我知道这样的问题已经被问了许多次,浏览过 Stack Overflow 后,我找到了部分答案,但不是完整的,而且安卓文档也没有真正帮助。显然,我知道它们是如何工作的并且以前多次使用过共享首选项,但我想知道在什么点(多少个)是太多了,我读到有人存储了大约100KBS而没有任何问题。长话短说 -

是否有人实际上因共享首选项中存储了太多数据而遇到了问题?如果有,问题是什么?数据会被删除吗?

**这只是出于好奇心的问题,我已经将我的大量值存储在SQL数据库中,只是想知道如果有人由于某种原因在共享首选项中存储了所有内容,会有什么问题和是否会有问题。


我知道它们的用途和使用时机,我只是想知道如果过度使用会引起什么问题。 - Marko Niciforovic
1
SharedPreferences主要用于存储一些基本数据类型,我认为没有限制。如果你真的想知道,你必须寻找“Android应用程序最大存储数据量”,但我怀疑你会在SharedPreferences周围找到答案。 - Droidman
谢谢Maver1ck,我会搜索一下安卓应用程序最大存储数据量。 - Marko Niciforovic
只是稍微扩展一下我的评论:一旦您使用SharedPreferences并发现您的应用程序在设置-应用程序中使用,您将看到“数据”部分不再为零。这就是我相信SharedPreferences使用的数据被概括为“应用程序数据”的原因,如果有限制,则等于应用程序允许存储的最大数据量。 - Droidman
3个回答

62

由于SharedPreferences存储在XML文件中,因此缺乏SQLite强大的事务支持,我不建议在SharedPreferences中存储“100KBS”。

话虽如此,目前我所知道的最低大小限制将是您的可用堆空间量,因为SharedPreferences会将整个XML文件的内容读入内存。


9
了解堆大小很有用。然而,我不认为我曾经让XML文件变得如此庞大。不知道为什么它们在第一次是XML而不是二进制文件(或JSON)。 - android developer
1
嘿,#CommonsWare!你的意思是存储大小约为100kb的字符串不是一个好主意吗? - Muhammad Adil
1
@CommonsWare 请问在 Android 应用程序中,Shared Preferences 的理想大小应该是多少才能保证平稳运行? - Gaurav Arora
2
@GauravArora:个人而言,我会尽量保持它小一些:大约几KB左右。 - CommonsWare
5
为了后人能够正确理解,请确保我们使用正确的单位来表示数据大小和速度。对于数据大小,例如KB(千字节)和KBs(其复数形式),请始终使用大写字母。而对于数据传输速度,则使用Kb和kb,并加上“ps”表示。因此,速度通常用kbps/Kbps(每秒千位或千字节)来表示。仅使用“kb”来表示数据大小是具有误导性的。而KBS听起来像是一个互联网广告,试图喊出它的高速度!还有,请注意8个比特等于1个字节,1024字节等于1KB(而不是kb)。谢谢! - Yo Apps
显示剩余2条评论

17

SharedPreference 数据有限制。在我的情况下,当 SharedPreference 数据超过 1428.51-kb 时会抛出内存异常。

因此,当您需要存储大量数据时,最好使用 SQLite 数据库。


3
你如何知道有限制?有文件记录吗?只是好奇,无论如何感谢您提供的信息。 - j2emanue
2
你有研究过这个吗?如果有文档的话,能否提供一下? - Kasun Hasanga

16

从您的问题中,我认为您不应该使用SharedPreferences,因为(a)它们旨在存储更小的数据量(因此使用XML),而且(b)有许多简单的替代方案。

SharedPreferences唯一的“特殊”之处在于它与首选项活动的集成,用于向用户显示其首选项,但基于您计划存储的数量,这可能不适用于您的情况。(哦,还有SharePreferences会处理并发问题。)

您可以使用Java的序列化将Preference类存储为二进制文件。它们比Comparable PreferenceFile小得多,并且可以通过GZIPInputStream轻松地传递,使其更小(或CipherInputStream)以加密它。我发现这种替代方式是一种功能强大、简单且跨平台的方式,可用于存储应用程序数据,其中不需要SQLite的功能。

(很抱歉这不是直接的答案。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接