Как использовать SharedPreferences для хранения постоянных данных Android

Я создаю приложение камеры. Я пытаюсь сохранить некоторую информацию, используя SharedPreferences. Я хочу сохранить некоторую постоянную информацию - путь к файлу последнего изображения. Но при первом использовании приложения перед фотографированием данные будут NULL.

Итак, я хочу получитьSharedPreferences в onCreate и проверить, равно ли значение null. Но, насколько я знаю, единственный способ использовать getSharedPreferences — это только если вы ранее вызывали редактор put. Следовательно, я впервые получаю исключение указателя NULL для объекта SharedPreferences.

How do you resolve this?

     //inside on Create()
      imageData = getSharedPreferences("ImageData",MODE_PRIVATE);

    SharedPreferences.Editor prefEditor = imageData.edit();

    prefEditor.commit();
    String previousImage = imageData.getString("lastImageTaken", null);
    if(previousImage == null){

        Log.d(TAG,"previous image is NULL");
    }
    else{
        //do something with the filepath            

        }
  //-----------------------
//in onClick of capture button
imageData = getSharedPreferences("ImageData",MODE_PRIVATE);

            SharedPreferences.Editor prefEditor = imageData.edit();
            prefEditor.putString("lastImageTaken", MyActivity.this.pictureFilePath);
            prefEditor.commit();


person Namratha    schedule 13.12.2011    source источник
comment
Можете ли вы пролить свет на String previousImage, это в общих настройках?   -  person Pratik Bhat    schedule 13.12.2011
comment
Для чего используется SharedPreferences.Editor prefEditor = imageData.edit(); prefEditor.commit(); эти линии?   -  person Pankaj Kumar    schedule 13.12.2011
comment
Ваш код не должен генерировать исключение нулевого указателя, даже если это произойдет, это не имеет ничего общего с отсутствием SharedPreference. Выложи свой стек, может там что-то найдем.   -  person Arnab Chakraborty    schedule 13.12.2011
comment
@Pankaj: объект SharedPreferences не имеет выделенной памяти. И мы не можем сказать новые SharedPreferences. В документации сказано, что если первый аргумент для getSharedPreferences не существует, вызов edit() создаст его. Вот поэтому я и попытался поставить эти 2 строчки в надежде выделить под них память. Пожалуйста, поправьте меня, если я ошибаюсь.   -  person Namratha    schedule 13.12.2011
comment
@Aki: Вы правы, я не получаю исключение указателя NUll с приведенным выше кодом. Я столкнулся с этим, когда строки put и commti были прокомментированы, и я получил исключение в строке imageData.getString, потому что imageData был нулевым. Теперь, даже если я прокомментирую 2 строки, как раньше, я не получу никаких исключений, потому что думаю, что нулевое значение было записано в настройках. Я не совсем уверен в том, что происходит. Я могу только догадываться.   -  person Namratha    schedule 13.12.2011
comment
@Namratha: так я правильно диагностировал NPE? проверьте мой первый комментарий   -  person Pratik Bhat    schedule 13.12.2011
comment
@android_hungry: строка previousImage хранится в SharedPreferences, как вы можете видеть в prefEditor.putString(lastImageTaken, MyActivity.this.pictureFilePath. Я пытаюсь получить эту строку.   -  person Namratha    schedule 13.12.2011
comment
@Namratha: в oncreate, очевидно, будет нуль, потому что ты пытаешься получить что-то, что никогда не помещалось   -  person Pratik Bhat    schedule 13.12.2011
comment
@android_hungry: Точно! Это как парадокс. Потому что только в первый раз он будет нулевым. Нет никакого способа узнать это, если у меня нет какого-то флага, который также должен быть записан в какую-то постоянную ячейку памяти. Так как это работает?   -  person Namratha    schedule 13.12.2011


Ответы (1)


Пожалуйста, попробуйте это
Чтобы читать из SharedPreferences

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    String name = preferences.getString("name","default");
    String email = preferences.getString("email","default");

Чтобы сохранить в SharedPreferences

Editor edit = preferences.edit();
                   edit.putString("name", "Roy");
                   edit.putString("email", "[email protected]");
                   edit.commit();
person Sandy    schedule 13.12.2011
comment
Сэнди прав, есть атрибут, который сохранит значение по умолчанию, если оно в настоящее время равно нулю. - person jfisk; 13.12.2011