Какой метод проверяет есть ли в файле preferences значение с заданным ключом

Обновлено: 06.07.2024

Хватит об Intent и Activity. Поговорим о хранении данных. В Android есть несколько способов хранения данных:

Preferences - в качестве аналогии можно привести виндовые INI-файлы

SQLite - база данных, таблицы

обычные файлы - внутренние и внешние (на SD карте)

Мы начнем с самого простого – Preferences. Значения сохраняются в виде пары: имя, значение. Так же, как и например extras в Intent.

Разработаем приложение. В нем будет поле для ввода текста и две кнопки – Save и Load. По нажатию на Save мы будем сохранять значение из поля, по нажатию на Load – загружать.

Project name: P0331_SharedPreferences
Build Target: Android 2.3.3
Application name: SharedPreferences
Package name: ru.startandroid.develop.p0331sharedpreferences
Create Activity: MainActivity

Откроем main.xml и создадим такой экран:

Поле ввода и две кнопки.

Теперь пишем код в MainActivity.java:

Определение элементов экрана, присвоение обработчиков и реализация onClick – тут все понятно и как обычно. Нам интересны методы, которые мы вызываем в onClick

Все сохраняем, запускаем приложение.

Для начала, давайте убедимся, что сохранение в принципе нужно. Введите какой-нить текст в поле ввода


Теперь найдите приложение в общем списке приложений эмулятора


и запустите снова.

Поле ввода пустое. То, что мы вводили – пропало при закрытии программы. Нажатие на Load тоже ничего не даст – мы ничего не сохраняли.


Давайте попробуем сохранять. Снова введите значение и нажмите Save.


Значение сохранилось в системе.


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

(Добавляете только строку 8)

а метод saveText - в onDestroy

Все сохраним, запустим. Теперь можно вводить данные, закрывать приложение, снова открывать и данные не потеряются. Кнопки Save и Load также работают. В какой момент сохранять данные в ваших приложениях – решать только вам. По нажатию кнопки, при закрытии программы или еще по какому-либо событию. Главное – теперь вы это умеете.

Еще немного слов по этой теме.

Preferences-данные сохраняются в файлы и вы можете посмотреть их. Для этого в Eclipse откройте меню Window > Show View > Other и выберите Android > File Explorer. Отобразилась файловая система эмулятора.
Открываем папку data/data/ru.startandroid.develop.p0331sharedpreferences/shared_prefs и видим там файл MainActivity.xml. Если его выгрузить на комп и открыть - увидим следующее:

Все верно, имя - saved_text и значение - abcdefg.

Обратите внимание, что в пути к файлу используется наш package.

Теперь разберемся, откуда взялось наименование файла MainActivity.xml. Кроме метода getPreferences, который мы использовали, есть метод getSharedPreferences. Он выполняет абсолютно те же функции, но позволяет указать имя файла для хранения данных. Т.е., например, если бы мы в saveText использовали для получение SharedPreferences такой код:

То данные сохранились бы в файле MyPref.xml, а не в MainActivity.xml.

Теперь если мы посмотрим исходники метода getPreferences, то видим следующее:

Используется метод getSharedPreferences, а в качестве имени файла берется имя класса текущего Activity. Отсюда и появилось имя файла MainActivity.xml.

- используете getPreferences, если работаете с данными для текущего Activity и не хотите выдумывать имя файла.

- используете getSharedPreferences, если сохраняете, например, данные - общие для нескольких Activity и сами выбираете имя файла для сохранения.

Кстати, в File Explorer вы можете видеть юниксовые rwx-права доступа к файлу. Попробуйте при сохранении данных использовать не MODE_PRIVATE, а MODE_WORLD_READABLE или MODE_WORLD_WRITEABLE и посмотрите, как будут меняться права.

Полный код MainActivity.java:

На следующем уроке:

- хранение данных с помощью SQLite

- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

- новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Чтобы получить экземпляр класса 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, и мне интересно, есть ли способ просто проверить, существует ли файл настроек.

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

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

в противном случае, если бы я делал что-то подобное каждый раз, когда страница загружается

Я предполагаю, что он переопределит все настройки, даже те, которые они установили.

SharedPreferences сохраняются в xml-файле. Вы можете найти его в /data / data/your_application_package/shared_prefs / Name_of_your_preference.в XML

чтобы проверить, существуют ли SharedPreferences 'Name_of_your_preference':

можно использовать contains метод SharedPreferences объект, чтобы проверить, существует ли один из ваших ключей предпочтений в файле. Если это возвращает false , можно предположить, что это первый раз и заполнить параметры по умолчанию. Документация для этого метода здесь.

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

@natur3: очень полезно, спасибо. Однако у меня есть небольшая проблема. с суффиксом файла. Если я определяю свое имя файла следующим образом:

и затем использовать:

f.exists () вернет false, даже если файл существует в файловой системе. Это потому, что Android добавит ".XML " суффикс автоматически при написании SharedPreferences, поэтому мне пришлось сделать ссылку на файл выглядеть так:

для его работы. Не знаю, откуда у тебя такие "предположения".в XML" суффикс.

мне удалось выяснить это, просмотрев файловую систему эмулятора в Eclipse с помощью Window - >Show View - >Other. а затем выберите "проводник".

вместо жесткого кодирования пути" /data/data/ " вы можете сделать следующее:

Я сделал это таким образом, чтобы его адаптируемый imo.

я использовал это в процессе проверки в onCreate, если предпочтения существуют или нет, и в зависимости от ответа включите кнопку, чтобы очистить настройки или нет - просто проверьте, что имя файла предпочтений в DDMS, если его не назвали вручную.

самый простой способ я нашел , мы можем проверить, существуют ли общие предпочтения встроенным кодом на android

проверяет, содержит ли предпочтения предпочтение. (это абстрактный логический открытый метод)

image

Отвечаю: и правда, абсолютно всю информацию можно хранить в таком виде. Иметь таблицу с настройками приложения (например, тёмная тема: вкл/выкл), а в другой таблице хранить ту самую информацию, которую отображает само приложение. Но эффективно ли это? Если информации много и SQL запросы помогают вам, то да, но не стоит забывать, что Базы Данных в большинстве случаев являются сложным механизмом, из-за чего производительность вашего приложения может быть снижена. Если информации не так много, то гораздо выгоднее использовать SharedPreferences.

Краткая теория, как использовать SharedPreferences

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

  • getPreferences() — внутри активности, чтобы обратиться к определённому для активности предпочтению,
  • getSharedPreferences() — внутри активности, чтобы обратиться к предпочтению на уровне приложения.
  • 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) .
  • MODE_APPEND — присоединяет новые настройки к существующим,
  • MODE_ENABLE_WRITE_AHEAD_LOGGING ,
  • MODE_MULTI_PROCESS ,
  • MODE_WORLD_READABLE — позволяет другим приложениям читать настройки,
  • MODE_WORLD_WRITEABLE — позволяет другим приложениям записывать новые настройки.

Начинаем эксперимент

Представим такой проект: на вход поступает json файл, в нём хранится информация о валютах (имя, стоимость и т. д.). Нам необходимо сохранить эти данные и при перезапуске приложения показать их, не читая json (все данные взяты из нашей БД). Возможные взаимодействия с карточкой валюты: изменение любого поля.

Все исходники вы сможете найти на GitHub в конце статьи.

Создадим самый обыкновенный класс и передадим ему в аргументы context для SharedPreferences. (Хотел бы услышать ваше мнение по поводу классов. Какой класс вы бы предпочли использовать в данной ситуации?)


Мы создадим два пространства. Первое будет хранить информацию о нашей DB и будет статично по своей размерности. В нём будет храниться количество наших карточек с валютами. Второе поле должно хранить те самые карточки, а значит — уметь динамически изменять свой размер.
Как оно будет работать? SharedPreferences хранит данные, как, грубо говоря, Map (ключ->значение), и вся информация находится в «таблице данных». Благодаря имени данной таблицы мы и будем передвигаться по карточкам. Новое имя таблицы = новая карточка. Таблицы мы будем называть цифрами, они будут выполнять роль их id. Так будет намного проще передвигаться по ним.

Создадим и проинициализируем глобальные переменные класса:


А вот и первая наша функция. Она позволяет узнать размер 2 поля (сколько таблиц оно содержит):


Если поле не создано, то возвращается 0.

Геттер создали, теперь время сеттера. Для этого создадим две функции:


ВНИМАНИЕ: если в конце не написать .apply(), изменения не сохранятся!

Вторая область

Теперь перейдём ко 2 области, нам необходимо уметь перемещаться по нашим «таблицам», для этого реализуем такую функцию:


Стоит немножко объяснить код. В аргументах мы принимаем название таблицы (её порядковый номер), после чего можно заметить проверку, которая сравнивает текущий порядковый номер таблицы с полученным, в случае если они не равны, происходит переприсвоение текущего названия таблицы и её открытие. Доступ к чтению таблицы мы получаем благодаря глобальной переменной prefs, а к редактированию — editor.

Добавление карточек к БД

Что же, думаю, можно перейти к заполнению нашей таблицы:


На вход мы получаем JSON объект, после чего увеличиваем количество всех наших таблиц, открываем новую таблицу и используем сеттеры. Ниже представлен код одного из таких сеттеров:


Тут без объяснений не обойтись. Функция принимает 2 аргумента, причём последний аргумент является необязательным (если его не изменять, он по умолчанию будет равен -1), а также может хранить null . Дальше идёт конструкция _id?.let<> , она позволяет запустить фрагмент кода (в фигурных скобках), если переменная не равна null . После чего идёт проверка, стандартное ли значение 2 аргумента. Если на вход мы получили номер таблицы -> открыть нужную таблицу. В конце присваиваем новое значение по ключу «ID» и не забываем применить все изменения с помощью .apply() . Для чего мы добавили возможность переменной _id хранить null , объясню чуть позже.

Подобные сеттеры нужно создать для каждого ключа JSON объекта.

Чтение карточки

Сеттеры отдельных ключей есть, а это значит, что наша самодельная БД уже умеет сохранять информацию, осталось научить её считывать. Ниже приведён пример одного из геттеров:


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

Поиск карточки

Замечательно, наша БД на SharedPreferences умеет сохранять и выводить данные, правда осталась одна нерешённая проблема. Предположим, что при работе с приложением пользователь захочет изменить определённую карточку, нажав на неё, для этого у нас уже существуют сеттеры, но откуда нам знать, какую именно таблицу нужно открыть для работы? Предположим, у нас есть возможность получить какую-нибудь информацию с карточки, например, сокращённое имя валюты. Получается, нам необходимо пройтись по всем существующим таблицам, найти совпадение и вывести название данной таблицы. Это долгая операция, поэтому таких ситуаций лучше не создавать, например, пусть каждая карточка в интерфейсе будет хранить свой локальный номер, который будет совпадать с названием таблицы, но если такой возможности нет, то в бой идёт наша новая «тяжёлая» функция:


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

DataBase на SharedPreferences в действии

Перейдём в наш MainActivity и создадим экземпляр нашего класса, наименовав его db. После чего получим JSONobject из памяти Android и в функции «createDB» запишем всю интересующую нас информацию в нашу db, затем прочитаем некоторую информацию карточки в функции readInfoDB, выпишем её, следом изменим внутри лежащую информацию с помощью функции editInfoDB и снова распечатаем результаты:


Поздравляю, оно работает! (P.S. lateinit в Kotlin советуют не использовать)


Если вдруг Logcat не работает, попробуйте его перезагрузить. (Обычно такое происходит из-за нехватки мощности компьютера).

image

Какие могут возникнуть трудности в будущем?

  • Удаление карточки-таблицы, т.к. это не связный список, при удалении все элементы будут сдвигаться, а это, в свою очередь, долгий процесс.
  • Добавление карточки не в конец списка приведёт к сдвигу всех элементов.
  • Нельзя наглядно увидеть, что хранится в Базе Данных.
  • При стирании кэша приложения всё сотрётся.
  • При замене всех параметров таблицы есть вероятность её потерять, т.к. неизвестно, по каким параметрам искать таблицу.
  • Очень рискованно.

Если у вас есть замечания по коду — пишите, обсудим в комментариях.

Если я правильно понял, вам надо куда-то сохранить строки из TextView и восстановить их после поворота активити или передать в другую активити. Для этого есть класс Bundle. В него можно сохранить ваши строки, а потом извлечь. Для сохранения в текущей активити используйте метод onSaveInstanceState(Bundle state) активити: @Override public void .


67.7k 8 8 золотых знаков 58 58 серебряных знаков 113 113 бронзовых знаков

Отличие файлов SharedPreferences от обычных файлов

Файлы SharedPreferences это обычные файлы с расширением .xml которые располагаются в подкаталоге конкретного приложения. При этом права доступа к файлу прописываются такие же как и всем остальным, которые принадлежат данному приложению. Соответственно получить доступ к нему можно не только программно, но и из файловой системы. Другим программам на устройстве .

Как автоматически закрыть приложение когда из Shared Preferences будет удалено значение

Используйте OnSharedPreferenceChangeListener: SharedPreferences.OnSharedPreferenceChangeListener spChanged = new haredPreferences.OnSharedPreferenceChangeListener() < @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) < // здесь можете закрыть приложение >>;


31.8k 15 15 золотых знаков 55 55 серебряных знаков 90 90 бронзовых знаков

Удаляются ли SharePref при обновлении приложения?

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


67.7k 8 8 золотых знаков 58 58 серебряных знаков 113 113 бронзовых знаков

Возможно ли при закрытии приложения или его запуске изменить SharedPreferences?

SharedPreferences используются именно для постоянного хранения данных. Если значение вам нужно только во время работы приложения, то сохраняйте его в памяти. Например в классе наследнике Application: public class App extends Application < public static App INSTANCE; private int count = 1; @Override public void onCreate() < super.


4,992 15 15 серебряных знаков 27 27 бронзовых знаков

Как задать значения для SharedPreferences при установке приложения?

Когда вы получаете значение из SharedPreferences, нужно также задать значение, которое вернётся, если по этому ключу ещё ничего не было записано. Например: SharedPreferences sharedPref = getSharedPreferences("имя файла", Context.MODE_PRIVATE); int value = sharedPref.getInt("ключ", 5); В данном случае, мы получим записанное в файл значение, если оно там .

10.6k 1 1 золотой знак 16 16 серебряных знаков 34 34 бронзовых знака

Что такое SharedPreferences?

Это текстовый файл в формате XML с интерфейсом взаимодействия (класс и методы чтения-записи) по принципу организации: ключ-значение. Первым аргументом метода чтения getInt("key", def)вы указываете ключ, это константа типа String, уникальное имя, по которому вы можете обратится к именно нужному значению, оно не должно быть "", а более осмысленным, как ".

36.5k 6 6 золотых знаков 44 44 серебряных знака 117 117 бронзовых знаков

Можно ли ArrayList с числами сохранить в SharedPreferences?

Можно сохранить JSON строку используя Gson. вот так например new Gson().toJson(new ArrayList<Integer>(list));

Как во фрагменте проверить изменилось ли значение SharedPreferences

Чтобы контролировать изменения в SharedPreferences на него можно повесить слушатель. Слушатель будет срабатывать каждый раз, когда в экземпляр настроек, к которым он подключен будут вносится любые изменения: public class SomeFragment extends Fragment implements SharedPreferences.OnSharedPreferenceChangeListener < SharedPreferences prefs; . prefs = .

36.5k 6 6 золотых знаков 44 44 серебряных знака 117 117 бронзовых знаков

После регистрации как правильно хранить данные пользователя

данные типа String хранятся в SharedPreferences в явном виде, практически в текстовом файле. Получить к нему доступ и прочитать эти данные - не очень сложная задача. Для предотвращения доступа к данным используйте шифрование. Как Core Java (пакеты crypto и security), так и фреймворк Android (класс AccountManger к примеру) предоставляют достаточно .

36.5k 6 6 золотых знаков 44 44 серебряных знака 117 117 бронзовых знаков

Работа с SharedPreferences

Метод contains проверяет наличие ключа, а не файла. А ключа с именем BasicSettings.APP_Preferences у вас скорее всего нет. Попробуйте так: if(mSettings.contains(BasicSettings.APP_Preferences_UserName‌​)) < . >


4,992 15 15 серебряных знаков 27 27 бронзовых знаков

Как в SharedPreferences соханить Date

10.9k 3 3 золотых знака 28 28 серебряных знаков 50 50 бронзовых знаков

После регистрации как правильно хранить данные пользователя

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

Как получить все данные из SharedPreferences

Для получения всех данных в виде Map<String, ?> можно воспользоваться методом Map<String, ?> getAll ().


21.9k 3 3 золотых знака 24 24 серебряных знака 35 35 бронзовых знаков

Отличие Bundle (SavedInstanceState) от SharedPreferences

Bundle и SharedPreferences – это две разные вещи. Объекты класса Bundle в основном используются для сохранения состояния объекта в процессе жизненного цикла того или иного компонента android-приложения (например, активити или фрагмента). SharedPreferences используется для сохранения каких-либо пар ключ:значение для их долгосрочного хранения. Основное .


21.9k 3 3 золотых знака 24 24 серебряных знака 35 35 бронзовых знаков

Получение настройки SharedPreferences из класса другого Activity

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

36.5k 6 6 золотых знаков 44 44 серебряных знака 117 117 бронзовых знаков

Не сохраняется или не правильно считывается SharedPreference

У вас оба значения сохраняются под одной меткой. Не знаю, что вы думали, назвав ключи notifWebSite и notifShops одним загадочным именем true, но если вы хотите, чтобы они хранили разные значения, то имена меток должны различаться. Это не параметр, а имя, под которым параметр будет сохранен в преференсах

36.5k 6 6 золотых знаков 44 44 серебряных знака 117 117 бронзовых знаков

Доступ к public SharedPreferences из друго класса

Храните настроки в PreferenceManager.getDefaultSharedPreferences(context);. Они вам будут доступны во всем приложении preferences = PreferenceManager.getDefaultSharedPreferences(context); preferences.getBoolean("firstrun", false) а положить туда так: SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);; Editor ed = pref.edit(); .

4,468 1 1 золотой знак 9 9 серебряных знаков 22 22 бронзовых знака

Не обновляется SharedPreferences в Service

В некоторых случаях проблему можно решить вызовом getSharedPreferences(. ) с флагом Context.MODE_MULTI_PROCESS. Но будьте внимательны, использовать Context.MODE_MULTI_PROCESS не рекомендуется, так как начиная с API level 23 оно deprecated. This constant was deprecated in API level 23. MODE_MULTI_PROCESS does not work reliably in some versions of .


21.9k 3 3 золотых знака 24 24 серебряных знака 35 35 бронзовых знаков

SharedPreferences crash [дубликат]

вы пытаетесь использовать settings до того, как запишете в него что-либо. ifWasSet = settings.getBoolean("comp",false); Сначала запишите что-нибудь в settings, а потом уже вызывайте у него методы.

20.3k 2 2 золотых знака 25 25 серебряных знаков 49 49 бронзовых знаков

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

Достаточно просто использовать this.getSharedPreferences("preferences", MODE_PRIVATE); В обеих Activity для того, чтобы они читали и записывали из/в одни и те же SharedPreferences

20.3k 2 2 золотых знака 25 25 серебряных знаков 49 49 бронзовых знаков

SQLite vs SharedPreference или как лучше хранить игровые ресурсы в игре

Shared preference все таки лучше использовать только для сохранения прогресса и настроек, потому что на самом деле shared preference это простой xml, при увеличении объема значительно упадет скорость, рекомендую использовать SQLite .


Временное сохранение объектов в SharedPreferences

Если вам надо сохранить состояние фрагмента между его показами, вы должны переопределить метод фрагмента onSaveInstanceState. В вашем случае это будет выглядеть примерно вот так: @Override public void onSaveInstanceState(Bundle outState) < super.onSaveInstanceState(outState); outState.putSerializable(FIRST_OBJECT_KEY, firstObject); outState.


Как в SharedPreferences соханить Date

Нужно всего лишь знать, что Date - это по факту обертка над обычным Long. У Date есть метод getTime(), который вернет кол-во милисекунд с 1980 года (точную дату не помню). Сохраните значение, которое вернет getTime(). Восстановить можно, передав в конструктор long, который вы достанете из SharedPreferences.

20.3k 2 2 золотых знака 25 25 серебряных знаков 49 49 бронзовых знаков

SharedPreferences в классе BroadcastReceiver не обновляет значение

Ну тогда все понятно. Дело в том, что по умолчанию SharedPreference не поддерживает актуализацию данных в между процессами. Иными словами если изменение данных производится в одном процессе не гарантируется, что в другом процессе изменения будут отражены. Чтобы побороть это вам надо создавать преференсы с флагом MODE_MULTI_PROCESS - читаем здесь

80.3k 7 7 золотых знаков 66 66 серебряных знаков 146 146 бронзовых знаков

Как удалить arraylist,из Sharedpreferences?

Удаляйте по ключу. SharedPreferences.Editor.remove(String key); Вообще, можно разные файлы использовать для сохранения данных разных типов.

10.6k 1 1 золотой знак 16 16 серебряных знаков 34 34 бронзовых знака

Не проходит проверка на последний JSONObject

:D У вас проверка if(i == message.length() - 1) Не проходит, так как вы проверяете не последний JSONObject, а последний элемент в нем. У вас JSONArray назван messages, а не message

Сохранить Timestamp в SharedPreferences Android

Можно перевести Timestamp в значение типа long, используя метод Timestamp.getTime() и сохранить в Shared Preferences значение типа long. Для обратного преобразования можно использовать конструктор Timestamp (long time) который принимает параметром значение типа long.

Как сохранить параметры в SharedPreferences

Замени это: if(prefrences.contains(APPNAME)) < txt1.setText(prefrences.getString("savedtext", "")); >На это: txt1.setText(prefrences.getString("savedtext", "")); Функция contains prefrences.contains(APPNAME) ищет значение по ключу APPNAME. Ты записываешь его по ключу savedtext, он же и сохраняется. prefrences.contains(APPNAME) возвращает false и код .

1,600 1 1 золотой знак 14 14 серебряных знаков 29 29 бронзовых знаков

Сохранение значения переменной String

Правильно, при новом открытии приложения у вас в Activity 2 снова вызывается метод onCreate и в нём вы стираете записанное ранее значение для ключа "sample_pack" значением null. И тогда в LoadPackPreferences() в переменную packName записывается значение по умолчанию - "arb". Попробуйте так: packName = getIntent().getStringExtra("sample_pack"); if (.


10.4k 4 4 золотых знака 36 36 серебряных знаков 81 81 бронзовый знак

android-shared-preferences × 166
android × 154
java × 74
kotlin × 14
android-studio × 8
recyclerview × 8
android-fragment × 6
android-preferences × 6
android-sdk × 5
activity × 5
checkbox × 5
listview × 4
arraylist × 4
sqlite × 3
flutter × 3
dart × 3
token × 3
json × 2
firebase × 2
android-intent × 2
adapter × 2
gson × 2
android-service × 2
хранение-данных × 2
broadcast-receiver × 2

Читайте также: