Android sharedpreferences не сохраняет

SharedPreferences

Чтобы получить экземпляр класса SharedPreferences для получения доступа к настройкам в коде приложения используются три метода:

  • getPreferences() — внутри активности, чтобы обратиться к определённому для активности предпочтению;
  • getSharedPreferences() — внутри активности, чтобы обратиться к предпочтению на уровне приложения;
  • getDefaultSharedPreferences() — из объекта PreferencesManager, чтобы получить общедоступную настройку, предоставляемую Android.

Все эти методы возвращают экземпляр класса SharedPreferences, из которого можно получить соответствующую настройку с помощью ряда методов:

  • getBoolean(String key, boolean defValue)
  • getFloat(String key, float defValue)
  • getInt(String key, int defValue)
  • getLong(String key, long defValue)
  • getString(String key, String defValue)

Обратите внимание, что тип double не поддерживается.

Чтобы создать или изменить Общие настройки, нужно вызвать метод getSharedPreferences в контексте приложения, передав имя общих настроек (имя файла):

По умолчанию используется MODE_PRIVATE — только приложение имеет доступ к настройкам. Также существуют другие режимы, с которыми практически не встречался.

  • MODE_APPEND — присоединяет новые настройки к существующим
  • MODE_ENABLE_WRITE_AHEAD_LOGGING
  • MODE_MULTI_PROCESS
  • MODE_WORLD_READABLE — позволяет другим приложениям читать настройки
  • MODE_WORLD_WRITEABLE — позволяет другим приложениям записывать новые настройки

Для любознательных могу добавить, что файлы настроек хранятся в каталоге /data/data/имя_пакета/shared_prefs/имя_файла_настроек.xml. Поэтому в отладочных целях, если вам нужно сбросить настройки в эмуляторе, то при помощи перспективы DDMS, используя файловый менеджер, зайдите в нужную папку, удалите файл настроек и перезапустите эмулятор, так как эмулятор хранит данные в памяти, которые он сбрасывает в файл. На устройстве вы можете удалить программу и поставить ее заново, то же самое можно сделать и на эмуляторе, что бывает проще, чем удалять файл настроек вручную и перезапускать эмулятор.

Если открыть файл настроек текстовым редактором, то можно увидеть приблизительно такое:

В данном случае в настройках хранятся только строковые значения.

Сохранение значений параметров

Для удобства создадим константу для имени файла настроек, например:

Далее нужно создать параметры, которые вы хотите сохранять в настройках. Удобнее их сделать константами:

Когда вы определили названия параметров, то можете сохранять любые значения этих параметров. Для этого создаём переменную, представляющую экземпляр класса SharedPreferences:

Внутри метода onCreate() вы инициализируете эту переменную:

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

Чтобы внести изменения в настройки (редактировать), нужно использовать класс SharedPreferences.Editor. Получить объект Editor можно через вызов метода edit объекта SharedPreferences, который вы хотите изменить. После того, как вы внесли все необходимые изменения, вызовите метод commit() или apply() объекта Editor, чтобы изменения вступили в силу. Метод apply() появился в API 9 и работает в асинхронном режиме, что является более предпочтительным вариантом. Метод commit() приходится использовать для старых версий и кроме того, он возвращает значение true в успешном случае и false в случае ошибки. Если вам надо отслеживать ошибки, то используйте его.

Предположим, что у нас есть два текстовых поля, где пользователь должен ввести имя кота и его и возраст. Чтобы сохранить параметр, нужно получить текст, который ввел пользователь, через метод getText().toString():

Получив нужный текст, сохраняем его через метод putString() (есть также putLong(), putBoolean() и т.п.):

Как правило, параметры сохраняют в методах активности onPause() или onStop() в тех случаях, когда данные требуются сохранить между запусками приложения. Но могут быть и другие сценарии.

Чтение значений параметров

Для считывания данных при загрузке приложения обычно используют методы onCreate() или onResume(). Нам нужно получить доступ к настройкам программы и проверить, есть ли среди них нужный нам параметр. Нас интересует ключ Nickname. Если мы его найдём, то загрузим его значение в текстовое поле.

Читайте также:  Произошла ошибка сети андроид

В этих строчках кода мы проверили существование параметра APP_PREFERENCES_NAME и получили его значение через getString(), передавая ключ и значение по умолчанию (используется в том случае, если для данного ключа пока что не сохранено никакое значение). Осталось только загрузить полученный результат в текстовое поле.

Аналогично поступаем и с другими параметрами через методы get () (getLong, getBoolean() и т.д.).

Если вам ещё не понятно, то ниже исходный код:

Показать код (щелкните мышкой)

Можно получить ассоциативный массив со всеми ключами и значениями через метод getAll(). После этого можно проверить наличие конкретного ключа с помощью метода contains().

Очистка значений

Для очистки значений используйте методы SharedPreferences.Editor.remove(String key) и SharedPreferences.Editor.clear().

Методы getStringSet() и putStringSet()

Начиная с API 11, у класса SharedPreferences появился новый метод getStringSet(), а у класса SharedPreferences.Editor родственный ему метод putStringSet(). Данные методы позволяют работать с наборами строк, что бывает удобно при большом количестве настроек, которые нужно сразу записать или считать.

Удаление файла

Как я уже сказал, файл настроек хранится в /data/data/имя_пакета/shared_prefs/имя_файла_настроек.xml. Вы можете удалить его программно, например так:

Учтите, что данные могут оставаться в памяти и временном файле *.bak. Поэтому, даже после удаления файла, он может заново воссоздаться. Вообще удалять файл не рекомендуется. Он автоматически удалится при удалении самой программы.

Метод getPreferences() — Сохранение состояния активности

Если вы хотите сохранить информацию, которая принадлежит активности и не должна быть доступна другим компонентам (например, переменным экземпляра класса), вы можете вызвать метод Activity.getPreferences() без указания названия Общих настроек. Доступ к возвращённому ассоциативному массиву Общих настроек ограничен активностью, из которой он был вызван. Каждая активность поддерживает только один безымянный объект Общих настроек.

Сохранение настроек на SD-карту

Сам файл с настройками хранится в системе и обычному пользователю он не виден. Если вам понадобится получить все значения, хранимые в настройках, то вы можете считать все данные при помощи метода getAll() и записать их в файл, который можно сохранить на SD-карте:

Я у тебя первый?

Предположим, вы хотите выводить пользователю какую-то информацию при первом запуске приложения (краткую инструкцию, заставку и т.п.).

Запомнить пользователя

Иногда требуется запомнить имя пользователя или другие данные (пин-код, номер телефона и т.д.). В этом случае вам также подойдут предпочтения, когда вы просто сохраняете нужную строку из текстового поля:

Запомнить состояние переключателей

Если нужно запомнить состояние переключателей, то код может быть таким. Создадим разметку с тремя переключателями.

Код, который отслеживает выбор переключателя и записывает состояние в настройки.

getDefaultSharedPreferences()

В используемых примерах я использовал getSharedPreferences() с придумыванием имени файла для хранения настроек. Этот способ придаёт гибкости в том случае, когда вам нужно создать несколько отдельных файлов. Но если вам нужен один файл, то можно ничего не придумывать, а использовать метод getDefaultSharedPreferences() из объекта PreferencesManager. Система сама сгенерирует имя файла из имени вашего пакета с добавлением слова _preferences. Вот как выглядит связка из трёх методов в исходниках Android (обратите внимание на выделенный текст).

Поэтому примеры можно переделать следующим образом.

Удаляем файл настроек

В API 24 появился новый метод, позволяющий удалить сам файл настроек. До этого можно было удалить своими силами, зная его местоположение. Поэтому универсальный код будет приблизительно следующим.

Источник

Android SharedPreferences не сохраняет

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

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

. тогда все экономит только хорошо. Что мне не хватает?

Я узнал, что это также работает:

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

Не имеет значения, создаю ли объект редактора:

Нам просто нужно более внимательно прочитать документацию

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

На самом деле это должно было быть отмечено в SharedPreferences.Editor не отправлять putStringSet набор, который впоследствии может быть изменен. Сделайте копию набора, возвращенного из getStringSet, перед изменением и сделайте копию своего набора перед отправкой его в putStringSet.

Читайте также:  Ns wallet для андроид как перенести данные

Я хотел бы немного улучшить ответ Chike.

причина

Причина, по которой commit() не сохранялась на диске, очевидна, если мы посмотрим на реализацию (неизмененную с v4.0.1), которая сначала берет на себя память, а затем ждет завершения записи на диск:

Дело в том, что никаких изменений не будет обнаружено, если мы вызываем putStringSet() с тем же экземпляром из getStringSet():

Поскольку никаких изменений не сделано, writeToFile() с радостью пропускает запись на диск и устанавливает успешный флаг:

Решение

См. Ответ Chike, сделайте копию набора String, прежде чем сохранять его в том же ключе SharedPreference.

Вам нужно сохранить объект Editor, а затем вызвать commit() (до Android 2.3) или применить() (для Android 2.3 и выше).

Я испытываю ту же проблему, которую вы описываете.

Мои логические и строковые настройки сохраняются без проблем, но когда я пытался хранить набор строк, проблемы начинаются.

Когда я добавляю первый элемент в набор строк и сохраняю его, он работает. Но, когда я пытаюсь добавить второй, он добавляется в память (я могу обновить представление, которое отображает все элементы, сохраненные в этом предпочтении). Если я принудительно закрываю приложение и снова его перезагружаю, общее предпочтение будет иметь только первый добавленный элемент.

Я отлаживал свой код и вижу, что HashSet, где я хранил свои строки, в порядке, когда я добавляю новый, но изменения не записываются в постоянное хранилище

Используйте следующую структуру для общих настроек:

1. Создать объект

2. Чтобы сохранить значения в общих предпочтениях:

Создайте редактор для общего предпочтения:

Затем поместите значения в Редактор:

Теперь зафиксируйте изменения, чтобы сохранить общие предпочтения:

Источник

При повторном запуске приложения не загружаются сохраненные значения SharedPreferences

SharedPreferences. Изображение не загружается при запуске приложения
В приложении кнопка, при нажатии на которую открывается галерея, там пользователь выбирает.

Как показать окно уже запущенного приложения при его повторном запуске?
Я использую такой код, но он не отрабатывает, проверял какой hwnd возвращает FindWindow — 0.

Как при запуске программы в мемо выводить ранее сохраненные данные из *.txt
Доброго времяни суток, я тут программу творю но не могу ни как сделать чтобы при запуске в мемо.

Возобновление при повторном запуске
Ребят помогите разобраться, ситуация такая, есть форма MainForm где отображены элементы управления.

name?, зато есть apply()

Добавлено через 4 минуты
vladbim, что-то как-то мне не по душе отэти прямые вызовы

Вложения

project.rar (4.79 Мб, 1 просмотров)

Решение

потому что onPause() и onResume() — это не просто методы, это коллбэки, методы в ответ на определённые события в «жизни» активити, не зависящие от того вызовете вы их явно где-то или нет, они сами «вызываются» в ответ на опредеелнный момент «жизни» активити.

Смотрим, что вы делаете.
В первый раз, вы вводите в поле mNumber текст, жмёте клик, вызываете onPause().
Всё хорошо.

Закрыли приложение, открыли.
Сработал onResume.

НО в поле mNumber НЕТ никакого текста.

В какой-то момент (скрытие с экрана, выход) срабатывает onPause() и что происхдит?

Правильно, в sharedpreferences загоняется значение mPhoneNumber, которого НЕТ.

Перенесите из onPause() всё в ваш onClick() и больше никогда так не делайте

И перестаньте лезть так нагло в «жизнь» активити — инициировать ее личные «события» там, где это совершенно не нужно — напишите свой отдельный метод и вызывайте раз уж вам он очень нужен

Источник

How do you save/store objects in SharedPreferences on Android?

I need to get user objects in many places, which contain many fields. After login, I want to save/store these user objects. How can we implement this kind of scenario?

I can’t store it like this:

«and executive Object«? Please check your grammar before posting on StackOverflow.

22 Answers 22

You can use gson.jar to store class objects into SharedPreferences. You can download this jar from google-gson

Читайте также:  Сенсорный моноблок с андроид

Or add the GSON dependency in your Gradle file:

you can find latest version here

Creating a shared preference:

To add to @MuhammadAamirALi’s answer, you can use Gson to save and retrieve a list of objects

Save List of user-defined objects to SharedPreferences

Get List of user-defined objects from SharedPreferences

I know this thread is bit old. But I’m going to post this anyway hoping it might help someone. We can store fields of any Object to shared preference by serializing the object to String. Here I have used GSON for storing any object to shared preference.

Save Object to Preference :

Retrieve Object from Preference:

Note :

Remember to add compile ‘com.google.code.gson:gson:2.6.2’ to dependencies in your gradle.

Example :

Update:

As @Sharp_Edge pointed out in comments, the above solution does not work with List .

A slight modification to the signature of getSavedObjectFromPreference() — from Class classType to Type classType will make this solution generalized. Modified function signature,

Better is to Make a global Constants class to save key or variables to fetch or save data.

To save data call this method to save data from every where.

Use it to get data.

and a method something like this will do the trick

Try this best way :

PreferenceConnector.java

Write the Value :

And Get value using :

You haven’t stated what you do with the prefsEditor object after this, but in order to persist the preference data, you also need to use:

You can save object in preferences without using any library, first of all your object class must implement Serializable:

Then you can easily use these two method to convert object to string and string to object:

See here, this can help you:

I had trouble using the accepted answer to access Shared Preference data across activities. In these steps, you give getSharedPreferences a name to access it.

Add the following dependency in the build.gradel (Module: app) file under Gradle Scripts:

To Save:

To Retrieve in a Different Activity:

hope this helps you 🙂

Step 1: Copy paste these two functions in your java file.

Step 2: to save use:

to retrieve use:

You can set different shared preferences by using different key names like:

there are two file solved your all problem about sharedpreferences

1)AppPersistence.java

2)AppPreference.java

now you can save,remove or get like,

-save

-remove

-get

If you want to store the whole Object that you get in response, It can achieve by doing something like,

First Create a method that converts your JSON into a string in your util class as below.

Then In Shared Preferences Class Do something like,

and then create a method for getPreferences

Then Just call the First method when you get response and second when you need to get data from share preferences like

Hope it will help you.

Happy Coding();

Here’s a take on using Kotlin Delegated Properties that I picked up from here, but expanded on and allows for a simple mechanism for getting/setting SharedPreference properties.

For String , Int , Long , Float or Boolean , it uses the standard SharePreference getter(s) and setter(s). However, for all other data classes, it uses GSON to serialize to a String , for the setter. Then deserializes to the data object, for the getter.

Similar to other solutions, this requires adding GSON as a dependency in your gradle file:

Here’s an example of a simple data class that we would want to be able to save and store to SharedPreferences:

Here is the one class that implements the property delegates:

Note: you shouldn’t need to update anything in the sealed class . The delegated properties are the Object/Singletons UserPreferenceProperty , NullableUserPreferenceProperty and FirstTimeUser .

To setup a new data object for saving/getting from SharedPreferences, it’s now as easy as adding four lines:

Finally, you can read/write values to SharedPreferences by just using the by keyword:

Источник

Оцените статью