[Android] SharedPreferences を使用してデータを保存する

今回は Android で SharedPreferences を使用してデータを保存する方法を見てみます。

SharedPreferences は、主にアプリの設定データなどをデバイス内に保存するための仕組みです。 SharedPreferences では、キー・バリュー形式(キーと値の組み合わせ)でテキストや数値を保存することができます。(オブジェクトなどのデータの保存には向いていません)

SharedPreferences を使って保存されるデータは、実体としては XML 形式のテキストファイルです。

保存できるデータ形式は、String、int、long、float、boolean、Set<String> です。 Set の扱いは、 API Level 11 から可能になりました。

準備

準備として、SharedPreferenes のインスタンスを取得しておく必要があります。 SharedPreferences のインスタンスの取得には、Context#getSharedPreferences() メソッドを使用します。

getSharedPreferences() メソッドでは、設定データファイルの名前と、ファイル操作モードを指定します。

ファイル操作モードで指定できる値は、Context.MODE_PRIVATE と Context.MODE_MULTI_PROCESS があります。
Context.MODE_PRIVATE は、そのアプリのみがアクセス可能な設定データファイルを作成します(デフォルト動作)。また、複数のプロセスがこのプレファレンスを読み書きする場合には Context.MODE_MULTI_PROCESS を設定する必要があります。

例えば、「myprefs」という名前の設定データファイルを作成する場合には、以下のように記述します。

SharedPreferences prefs = getSharedPreferences("myprefs", Context.MODE_PRIVATE);

このようにして用意したインスタンスを利用して、実際のデータの読み書きを行います。

データの保存

データを保存する場合は、SharedPreferences のインスタンスから、edit() メソッドを使って SharedPreferences.Editor オブジェクトを取得し、このオブジェクトで用意されている putString() などのメソッドを使ってデータを保存します。

注意点としては、保存用のメソッドを呼び出した後に、変更をファイルに反映させるために apply() あるいは commit() メソッドを呼び出す必要があることです。(apply() は API Level 9 で追加されたメソッドで、commit() と同様に変更をファイルに反映させますが、非同期でディスクへの書き出しを行うため commmit() より効率がいいようです)

データは、キーと値の組み合わせで保存します。例えば、fruits というキーに対して Apple という値を保存したい場合は、以下のように記述します。

SharedPreferences prefs = getSharedPreferences("myprefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("fruits", "Apple");
editor.apply();

他には、int の値を保存する場合は putInt()、Set<String> の値を保存する場合は putStringSet() というようなメソッドを使用します。

このようにして保存されたデータは、XML 形式で例えば以下のように保存されます。

<map>
  <string name="fruits">Apple</string>
</map>

ただ、SharedPreferences の利用においては、実際どのようにデータが保存されているかを気にする必要はありません。

データの読み出し

SharedPreferences に保存されたデータを読み出す場合は、SharedPreferences の getString() 等のメソッドを利用します。
例えば、上記のようにして保存された fruits というキーのデータを読み出す場合は、以下のように記述します。

SharedPreferences prefs = getSharedPreferences("myprefs", Context.MODE_PRIVATE);
String fruits = prefs.getString("fruits", "");

getString() メソッドの最初の引数はキーの名前、2番目の引数はデフォルト値の指定です。

他には、int の値を読み出す場合は getInt()、Set<String> の値を保存する場合は getStringSet() というようなメソッドを使用します。

因みに、あるキーに対して、保存時と読み出し時の型の指定が異なる場合、読み出し時に自動変換できない型(例えば boolean で保存して String で読み出すなど)だと java.lang.ClassCastException の例外が発生します。

補足

getSharedPreferences() メソッドでは、設定データファイルの名前を指定しますが、アプリ内で1つの設定ファイルのみを使用する場合は、PreferenceManager#getDefaultSharedPreferences() メソッドを使うと、設定データファイルの名前や操作モードを自動的に設定してくれます。この場合は、SharedPreferences インスタンスの取得は以下のような記述になります。

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

この場合、操作モードは Context.MODE_PRIVATE となります。

参考

公式サイトの SharedPreferences の説明ページ:SharedPreferences | Android Developers

公式サイトのデータ保存の説明ページ: Storage Options | Android Developers


Pocket
Bookmark this on Yahoo Bookmark

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>