SharedPreferences. Сохранение данных в постоянное хранилище Android

SharedPreferences — постоянное хранилище на платформе Android, используемое приложениями для хранения своих настроек, например. Это хранилище является относительно постоянным, пользователь может зайти в настройки приложения и очистить данные приложения, тем самым очистив все данные в хранилище.

Для работы с данными постоянного хранилища нам понадобится экземпляр класса SharedPreferences, который можно получить у любого объекта, унаследованного от класса android.content.Context (например, Activity или Service). У объектов этих классов (унаследованных от Context) есть метод getSharedPreferences, который принимает 2 параметра:

  • name — выбранный файл настроек. Если файл настроек с таким именем не существует, он будет создан при вызове метода edit() и фиксировании изменений с помощью метода commit().
  • mode — режим работы. Возможные значения:
    • MODE_PRIVATE — используется в большинстве случаев для приватного доступа к данным приложением-владельцем
    • MODE_WORLD_READABLE — только для чтения
    • MODE_WORLD_WRITEABLE  — только записи
    • MODE_MULTI_PROCESS — несколько процессов совместно используют один файл SharedPreferences.

ВНИМАНИЕ! Все модификаторы кроме MODE_PRIVATE в настоящий момент объявлены deprecated и не рекомендуются к использованию в целях безопасности. Если необходимо реализовать использование общих данных несколькими приложениями, это можно сделать через сервисы или контент-провайдеры. Подробнее можно почитать, например, здесь.

Чтобы получить значение необходимой переменной, используйте следующие методы объекта 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),
  • getStringSet(String key, Set defValues).

Второй параметр — значение, которое вернется в случае если значение по ключу key отсутствует в SharedPreferences. Также, методом getAll() можно получить все доступные значения.

Чтобы записать значение переменной необходимо:

  1. получить объект SharedPreferences.Editor выполнив метод edit() объекта класса SharedPreferences
  2. записать значение с помощью методов:
    • putBoolean(String key, boolean value),
    • putFloat(String key, float value),
    • putInt(String key, int value),
    • putLong(String key, long value),
    • putString(String key, String value),
    • putStringSet(String key, Set values)
  3. выполнить метод commit()

Также есть возможность удалить конкретное значение (remove(String key)) или все значения (clear())

Приведенный ниже код демонстрирует запись переменной типа String в хранилище:

SharedPreferences settings = context.getSharedPreferences(PERSISTANT_STORAGE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString( "name", "John" );
editor.commit();

— context — объект, унаследованный от android.content.Context.

Представим простой класс для работы с постоянным хранилищем — PersistantStorage.

Перед записью значений в хранилище или получением значений из хранилища, класс нужно проинициализировать, вызвав метод init() и передав ему объект, унаследованный от android.content.Context (например, Activity или Service).

import android.content.Context;
import android.content.SharedPreferences;

public class PersistantStorage {
public static final String STORAGE_NAME = "StorageName";

private static SharedPreferences settings = null;
private static SharedPreferences.Editor editor = null;
private static Context context = null;

public static void init( Context cntxt ){
context = cntxt;
}

private static void init(){
settings = context.getSharedPreferences(STORAGE_NAME, Context.MODE_PRIVATE);
editor = settings.edit();
}

public static void addProperty( String name, String value ){
if( settings == null ){
init();
}
editor.putString( name, value );
editor.commit();
}

public static String getProperty( String name ){
if( settings == null ){
init();
}
return settings.getString( name, null );
}
}

В этом классе реализована работа только со строковыми данными. Вы легко можете самостоятельно его расширить, используя стандартные методы PersistantStorage или написав собственные сериализаторы для сложных объектов.

ВНИМАНИЕ! Метод commit() устарел и объявлен deprecated. Вместо него следует использовать метод apply() — он появился в API 9 и работает в асинхронном режиме, что является более предпочтительным вариантом.

Комментарии: 7
  1. Navruz

    как мне узнать сколько раз запускалось мое приложения

    1. admin (автор)

      С помощью SharedPreferences можно создать сохраняемое значение — счетчик. Каждый раз при старте главного активити получать его, увеличивать на единицу и сохранять снова.

  2. mishanovosel@i.ua

    Подскажите в вашем примере у меня студия пишет что static Context может привести к утечке памяти. Правильно так делать?

  3. serega

    Итересно получается в коде пишете editor.commit();
    а внизу жирными буквами ВНИМАНИЕ! Метод commit() устарел и объявлен deprecated

    1. admin (автор)

      Это замечание добавлено в статью позже. «Устарел» и «deprecated» не значит «не работает». В Android SDK полно таких методов. См. комент выше.

  4. deeee

    будет . только apply работает только в версиях выше 9
    изначально commit. возвращает true и false

Добавить комментарий