Help us understand the problem. What is going on with this article?

SharedPreferencesの使い方(基礎編)

More than 3 years have passed since last update.

基本情報

SharedPreferencesはデバイス内にデータを保存するための仕組みです。
保存されたデータはActivityが終了しても保持されるので、基本的にはアプリの設定を保存するために用いられます。

保存できるデータは以下の5つです。

  • String型
  • boolean型
  • int型
  • long型
  • float型

インスタンスの取得方法

インスタンスの取得方法には以下の3つのメソッドがあります。

  • Context#getPreferences(int)
  • Context#getSharedPreferences(String, int)
  • PreferenceManager#getDefaultSharedPreferences(Context)

ではそれぞれの使い方について見ていきましょう

Context#getPreferences(int)

GetPreferences.java
SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);

引数でモードを渡します。
他にMODE_WORLD_READABLE / MODE_WORLD_WRITEABLE / MODE_MULTI_PROCESSがありますが、モードについては後述します。

Context#getSharedPreferences(String, int)

GetSharedPreferences.java
SharedPreferences prefs = getSharedPreferences("SaveData", Context.MODE_PRIVATE);

引数で保存データの名前とモードを渡します。

PreferenceManager#getDefaultSharedPreferences(Context)

GetDefaultSharedPreferences.java
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

*getDefaultSharedPreferencesで作成したSharedPreferencesのモードはデフォルトでMODE_PRIVATEです。

データの書き込み

put.java
SharedPreferences.Editor editor = prefs.edit();
editor.putString("string", "value");
editor.putBoolean("boolean", false);
editor.putInt("int", 0);
editor.putLong("long", 0);
editor.putFloat("float", 0.0);
editor.apply();

それぞれのデータ形式に対応するputメソッドの引数にKey=Vakue形式でデータを書き込み、最後にapply(保存)をします。

データの読み込み

get.java
String str = prefs.getString("string");
boolean bool = prefs.getBoolean("boolean");
int intNum = prefs.getInt("int");
long longNum = prefs.getLong("long");
float floatNum = prefs.getFloat("float");

それぞれのデータ形式に対応するgetメソッドの引数に保存した際のKeyを渡し取得します。

保存したデータ

ファイルパス

/data/data/[パッケージ名]/shared_prefs/

ファイル名

getPreferences(int)で作成した場合
[Activityのクラス名].xml

getSharedPreferences("SaveData", int)で作成した場合
SaveData.xml

getDefaultSharedPreferences(Context)で作成した場合
[パッケージ名]_preferences.xml

形式

XML形式で保存されます。

[パッケージ名]_preferences.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="string">value</string>
    <boolean name="boolean" value="false" />
    <int name="int" value="0" />
    <long name="long" value="0" />
    <float name="float" value="0.0" />
</map>

保存したデータのモードについて

モード名 効果 備考
MODE_PRIVATE 自アプリのみ読み書き可能
MODE_WORLD_READABLE 他アプリから読み取り可能 API Level17で非推奨
MODE_WORLD_WRITEABLE 他アプリから書き込み可能 API Level17で非推奨
MODE_MULTI_PROCESS 複数のプロセスで読み書き可能 API Level23で非推奨
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away