Android отказывается писать / создавать файл общих настроек - PullRequest
4 голосов
/ 23 апреля 2011

Я использую Eclipse 3.5.2 IDE для разработки под Android.Я использую следующий код для записи в файл sharedpreferences по умолчанию и запускаю его в adb emulator :

private SharedPreferences getOurSharedPreferences(Activity act) {
    // return getSharedPreferences(SHARED_PREFS_FILENAME, MODE_PRIVATE);
    return act.getPreferences(MODE_PRIVATE);
}

private void putStringToStorage(Activity act, String keyName, String s) {

    // Store it.
    SharedPreferences sharedPrefs = getOurSharedPreferences(act);
    SharedPreferences.Editor editor = sharedPrefs.edit();
    editor.remove(keyName);
    // editor.putString(keyName, s);
    editor.putString(keyName, "test123");
    boolean bCommitted = editor.commit();
    if (!bCommitted) 
        throw new RuntimeException("(AndroidApplication) Unable to save new string.");

    // Get it back as a test.
    // String s2 = getStringFromStorage(keyName);
}

Описанный выше метод относится к Application мой подкласс, поэтому метод содержит объектный параметр Activity , поэтому я могу иметь доступ к Activity.getPreferences () .Обратите внимание, что ранее я использовал глобальный вызов getSharedPreferences () , но я изменился на getPreferences () из-за отчаяния из-за проблем, с которыми я столкнулся.Причина, по которой я пишу " test123 " вместо переменной " s ", заключается в том, чтобы убедиться, что проблема, с которой я столкнулся, не связана с каким-либо значением " s", что, возможно, файлу общих настроек может не понравиться.

Всякий раз, когда я запускаю код editor.commit () всегда возвращается FALSE .Немного истории.Некоторое время назад мне удалось записать файл общих настроек, используя файл общих настроек с именем app_global, созданный с использованием глобального getSharedPreferences () вызова вместо Activity.getPreferences () .Мне удалось записать и прочитать значение из этого файла общих настроек, однако всякий раз, когда я перезапускал свое приложение, значения, которые я писал во время последнего сеанса, исчезали.В рамках моих усилий по отладке я зашел в adb shell и удалил «app_global» из папки shared_prefs моего приложения.С тех пор эмулятор появляется, не желая создавать новый файл общих настроек, по умолчанию или нет.

Обратите внимание, что окно LogCat всегда пусто, а окно Console не показывает никаких ошибок, в том числе при запуске моего приложения в эмуляторе.Я также попытался запустить приложение в режиме отладки, отметив " Wipe User Data " в конфигурации отладки.Это тоже не помогло.Независимо от того, что я делаю editor.commit () завершается ошибкой и папка shared_prefs для моего приложения при выполнении " ls -a " из оболочки adb всегда пуст .

Мои вопросы:

  • Я где-то читал про " перестройку образа пользователя " дляэмулятор.Это техника, которую я мог бы использовать, чтобы попытаться исправить этот кластер проблем, которые я имею с общим хранилищем предпочтений?Если да, как мне это сделать?

  • Есть ли что-нибудь еще, что я мог бы попытаться решить эту проблему?

- roschler

1 Ответ

2 голосов
/ 23 апреля 2011

Мне удалось решить проблему путем ручного воссоздания файла sharedpreferences . Я не могу быть уверен в этом, но похоже, что если вы вручную удалите файл sharedpreferences, принадлежащий эмулятору, он не будет воссоздан, даже если вы выберете опцию " Wipe User Data ". Чтобы вручную восстановить файл sharedpreferences, я сделал следующее:

  • Загрузить оболочку ADB
  • Перейдите в папку sharedpreferences (обратите внимание, что у вас должен быть запущен эмулятор, иначе вы получите сообщение об ошибке " device not found ", если вы не подключили телефон)
  • Создайте пустой файл с именем файла sharedpreferences, который вы используете в своем коде. В моем случае я создал файл с именем app_global.

Вы можете найти папку sharedpreferences здесь:

/data/data/your.app.package.name/shared_prefs

Где your.app.package.name - имя пакета вашего приложения. Для создания пустого файла из оболочки ADB я использовал команду:

echo -n >app_global

Где "app_global" - это то, что вы назвали своим файлом sharedpreferences. Параметр -n предотвращает добавление перевода строки в файл. Если вы используете getPreferences () , тогда имя файла общих настроек по умолчанию - "your.app.package.name_preferences.xml".

Я получил информацию о папке sharedpreferences из этого сообщения StackOverflow:

Как проверить SharedPreferences из оболочки adb?

- Рошлер

...