Android SharedPreferences的限制是什么?

17

我在安卓上开发了一款游戏,目前将大部分游戏统计数据存储在数据库中。然而,应用程序只利用了数据库中的单行数据。现在我有兴趣引入一些新的统计数据,但这将导致我的数据库重新安装,从而清除每个人的进度。为避免将来出现这种情况,我考虑使用SharedPreferences来存储游戏统计数据。我的问题是,在变成问题之前可以存储多少不同的内容。总共会存储约40个值,都是整数。


可以将40个整数存储在SharedPreferences中。 - Alexander Kulyakhtin
4个回答

25

SharedPreferences被写入XML文件,因此在Android上文件的最大大小就是一个SharedPreferences XML文件的大小。我可以肯定地说,40个整数值不会有问题。

在SharedPreferences文件中值的最大大小受到你尝试存储的值的最大大小的限制。(这意味着你不能存储一个比Java中字符串长度更长的字符串值。)

我唯一建议的是尽可能批量处理更改(意思是不要为每个更改调用.commit()),也不要为每个更改创建新的编辑器。(这些只是良好的编程实践。)

SharedPreferences settings = getSharedPreferences(PREFS_FILE_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("firstValue", mFirst);
editor.putInt("secondValue", mSecond);
editor.putInt("thirdValue", mThird);

// Commiting the edits
editor.commit();

3
"longer than Strings can be in Java" - 字符串在Java中最长可以有2^31-1=20亿个字符。但这可能取决于手机的内部存储。 - Teo Inke

7
我不清楚是否有任何限制,但关于每个人的进度被清除的问题。您可以覆盖您的SQLite类中的onUpgrade方法,然后将所有人的数据迁移到新的数据库中。

2
没错。请查看记事本示例 - 您可以使用 ALTER TABLE 添加新列,或者您可以添加全新的表格。您可以切换到 SharedPreferences,但既然您已经选择了数据库方法,那么最好坚持下去。 - EboMike
我想我会尝试使用SharedPreferences模型,看看哪个更好。不过我会保留数据库,因为我计划在某个时候允许保存多个游戏进度。感谢您提供的关于Alter Table的提示,它将帮助我迁移到SharedPreferences并保留每个人的进度。 - Tim

2
不要使用共享偏好设置来保存游戏数据。我可以下载你的游戏,并使用下面的工具对它进行破解。如果你的金钱存储在那里,我只需要将它改为420万金币就可以了。 https://www.kingoapp.com/root-tutorials/hack-app-game-cheat-droid.htm 有什么办法能阻止某个人用共享偏好设置编辑他们的XML文件呢?
我无法相信在回答你的问题时没有人想到这点。在视频游戏环境中,你的限制是相当严重的。没有任何东西能够阻止任何人编辑他们所有的共享偏好设置数据来破解你的游戏。

如果您想使用SP存储游戏数据,可以使用“javax.crypto.Cipher”进行加密,这样会更难被黑客攻击。 - Jan Rozenbajgier
它仍然不是其预期用途,将其加密在那个位置并不是一个好主意,因为一旦单个用户破解了该加密,您的整个世界都会崩溃,并且此时您必须解密整个用户数据库并使用新的未破解、可破解的密码重新加密。SP 用于保存诸如深色模式切换或其他基本非敏感配置之类的内容。 - Krausladen


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