今回は Android で SharedPreferences を使用してデータを保存する方法を見てみます。
SharedPreferences は、主にアプリの設定データなどをデバイス内に保存するための仕組みです。 SharedPreferences では、キー・バリュー形式(キーと値の組み合わせ)でテキストや数値を保存することができます。(オブジェクトなどのデータの保存には向いていません)
SharedPreferences を使って保存されるデータは、実体としては XML 形式のテキストファイルです。
保存できるデータ形式は、String、int、long、float、boolean、Set<String> です。 Set
準備
準備として、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