Android 保存在SharedReferences中的用户设置在重新加载应用程序之间被删除或丢失

Android 保存在SharedReferences中的用户设置在重新加载应用程序之间被删除或丢失,android,sharedpreferences,Android,Sharedpreferences,我的应用程序存储了简单的设置,工作正常。 然而,对于一个下载了我的应用程序的人来说,我遇到了问题。 中的设置在关闭和重新加载应用程序之间丢失 他手机上的某个地方是否存在权限问题,从而阻止在会话之间保存数据 有没有人经历过这种情况,或者知道发生这种情况的原因? 我很难调试它,我不知道从哪里开始 // I'm using SharedPreferences Like so: prefs = getSharedPreferences(this.getString(R.string.prefs_name

我的应用程序存储了简单的设置,工作正常。 然而,对于一个下载了我的应用程序的人来说,我遇到了问题。 中的设置在关闭和重新加载应用程序之间丢失

他手机上的某个地方是否存在权限问题,从而阻止在会话之间保存数据

有没有人经历过这种情况,或者知道发生这种情况的原因? 我很难调试它,我不知道从哪里开始

// I'm using SharedPreferences Like so:
prefs = getSharedPreferences(this.getString(R.string.prefs_name), 0);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("accounts", accounts);
editor.commit();

//retrieving stored information like:
SharedPreferences prefs = getSharedPreferences(this.getString(R.string.prefs_name), 0);
String accounts = prefs.getString("accounts","[]");

我们的Android应用程序也遇到了同样的问题。我们的用户群相当大(数百万用户),根据我们的统计,大约有0.2%-0.3%的用户出现了问题。它似乎不是那么多,但有了我们的用户群,它就有了成千上万的用户


经过长时间的修复,我们决定停止在我们的项目中使用
SharedReferences
。我们使用的是simple
SQLiteDatabase
,它工作得非常好。

我也遇到了同样的问题。幸运的是,我可以访问该设备,它帮助我发现了问题。首先,我研究了日志文件,发现错误:

W/SharedPreferencesImpl(31354): org.xmlpull.v1.XmlPullParserException: Map value without name attribute: string
所以,首选项文件在某种程度上已损坏。我已使首选项文件世界在我的应用程序中可访问:

SharedPreferences prefs = context.getSharedPreferences("main", Context.MODE_WORLD_READABLE);
然后我将文件从设备拉到计算机

adb pull data/data/my.package.name/shared_prefs/main.xml c:\main.xml
并检查首选项文件内容:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string>Paris,France</string>
<string name="HideStatusBar">1</string>

名称为空。我已经修复了错误,问题消失了。所以,一个小错误可能会完全损坏首选项文件

您应该对应用程序进行更新,以临时保存、清除和重新创建首选项文件


我也有类似的情况。一些用户不仅把他们的首选项文件弄乱了,还把他们的SQL数据库弄乱了。你不能要求人们删除并重新安装,他们可能会丢失数据。但是你的应用程序可以先自动备份,删除损坏的文件,然后将其全部放回原处。

你使用的是DefaultSharedReferences吗?如果没有,您是否确保使用的字符串键在不同使用之间相同?如果没有代码片段,很难知道你做错了什么。嘿,不只是共享参考资料,我一直在使用相同的密钥,这个应用程序可以为数千人工作,只有这个人。依赖于这些信息的应用程序的其余部分在他关闭应用程序之前都能正常运行。这可能是存储空间问题吗?有趣的是,为什么我没有想到这一点,我看看他怎么说。Ta@Rob你知道这件事的真相吗?我的一个用户报告了完全相同的问题。感谢您的输入。我也一直在应用程序中使用SQLiteDatabase。SharedPreferences不可信。接受答案,尽管它没有解释SharedPreferences的问题,但这是解决SharedPreferences这种破坏行为的唯一合理方法。
 SharedPreferences.Editor e = _Prefs.edit();
 e.putString(null, paramValue);
 e.commit()