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

时间:2011-05-10 20:05:03

标签: android sharedpreferences

我的应用程序在SharedPreferences中存储了简单的设置,它运行正常。 然而,对于一个下载我的应用程序的人来说有问题。 关闭和重新加载应用程序时,SharedPreferences中的设置会丢失。

他的手机某处是否存在权限问题导致数据无法在会话之间保存?

有没有人经历过这个或知道为什么会发生这种情况? 我很难调试它,我不知道从哪里开始。

// 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","[]");

3 个答案:

答案 0 :(得分:8)

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

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>

第一个参数没有“name”属性。我检查了一个代码,发现在某些情况下,第一个参数是按照以下方式编写的:

 SharedPreferences.Editor e = _Prefs.edit();
 e.putString(null, paramValue);
 e.commit()     

名称为空。我已修复错误,问题已消失。因此,琐碎的错误可以完全破坏首选项文件。

答案 1 :(得分:7)

我们的Android应用遇到了同样的问题。我们的用户群非常庞大(数百万用户),根据我们的统计数据,大约0.2% - 0.3%的用户遇到了问题。它似乎并不是那么多,但我们的用户群却是成千上万的用户。

经过长时间搜索此问题的修复程序后,我们决定停止对我们的项目使用SharedPreferences。我们使用的是简单的SQLiteDatabase,而且效果非常好。

答案 2 :(得分:0)

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

我有类似的情况。有些用户不仅使他们的首选项文件搞砸了,而且还有他们的SQL数据库。您无法真正要求人们删除并重新安装,他们可能会丢失数据。但是你的应用程序可以自动备份它,删除损坏的文件,然后把它全部放回去。