Пользовательские настройки, сохраненные в SharedPreferences, удалены или потеряны между перезагрузками приложения - PullRequest
8 голосов
/ 11 мая 2011

Мое приложение хранит простые настройки в 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 ]

8 голосов
/ 25 декабря 2012

У меня была такая же проблема. К счастью, у меня был доступ к устройству, и это помогло мне найти проблему. Прежде всего, я изучил файл журнала и обнаружил ошибку:

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()     

Имя было пустым . Я исправил ошибку, и проблема исчезла. Итак, банальная ошибка может полностью испортить файл настроек.

7 голосов
/ 10 октября 2012

У нас возникли те же проблемы с нашими приложениями для Android.Наша база пользователей довольно велика (несколько миллионов пользователей), и, согласно нашей статистике, проблемы возникали примерно у 0,2% - 0,3% пользователей.Вроде бы не так много, но с нашей базой пользователей это тысячи пользователей.

После долгих поисков исправлений этой проблемы мы приняли решение прекратить использование SharedPreferences для наших проектов.Вместо этого мы используем простой SQLiteDatabase, и он работает очень хорошо.

0 голосов
/ 11 марта 2013

Вы должны выпустить обновление для вашего приложения, которое временно сохраняет, очищает и заново создает файл настроек.

У меня была похожая ситуация. Некоторые пользователи испортили не только файл настроек, но и базу данных SQL. Вы не можете попросить людей удалить и переустановить, они могут потерять данные. Но ваше приложение может сначала автоматически создать резервную копию, удалить поврежденные файлы, а затем вернуть все обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...