SharedPrefernceとは
SharedPreferencesとは情報をAndroidデバイス内に保存する仕組みです。「わーじゃあSQLiteいらないやん」と一瞬なるかもしれませんが、キー・バリュー形式で1対1で保存されるだけなのでデータをオブジェクトとしてidで紐付けて管理するといったようなことは出来ません。よって、主にユーザー設定や状態保存など、単純で少量の環境設定保存に用いられます。その実態はXML形式のテキストファイルです。保存できるデータの型はString, int, float, long, boolean, Set<String>
です。
今回は入門ということで基本的な使用方法を説明します。
Quick Start
1.SharedPreferenceのインスタンスを生成します
自分のアプリの任意のContextからgetSharedPreferences()
を呼び出すことで、SharedPreferences
インスタンスを取得します。
同様のインスタンスは1つのActivityからは、1つしか生成できません。
SharedPreferences preferences = getSharedPreferences("DATA", Context.MODE_PRIVATE);
ここで1つめの引数は生成する設定ファイルのキー(つまりファイル名のようなもの)です。これはアプリ内で固有のものである必要があります。2つめの引数はこの設定ファイルが自分のアプリ内のみからアクセス可能か、他のアプリからも読み書きが出来るかを設定する定数です。Android端末の設定(音量や明るさ)は外部アプリからも変更できるので、後者(Context.MODE_WORLD_READABLE)であることが多いと考えられます。
###2. データを書き込みます
続いて、SharedPreference.Editorを生成します。このオブジェクトはSharedPreferencesオブジェクトの持つデータを変更する複数のメソッドを持ちます。putXXX(String key, xxx value)
といったようにキー・バリュー形式でデータをセットしてあげます。
そしてapply()することで、保存の反映を行います。
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("HEIGHT", 100);
editor.putBoolean("MARRIED", true);
editor.apply();
apply()と同様のメソッドでcommit()がありますが、得られる処理は同じです。
その違いとしては、commit()は同期処理でapply()は非同期処理だということです。以下の公式ドキュメントからの引用に示したように、同じSharedPreferenceインスタンスのeditオブジェクトで完了していない非同期のapply()処理が終わるまで、ブロックされてしまいます。ただ、データ量が少ないことを考えるとどちらでもあまり問題はないように思えます。
If another editor on this SharedPreferences does a regular commit() while a apply() is still outstanding, the commit() will block until all async commits are completed as well as the commit itself.
3. データを読み込みます
呼び出し元のContextにおいて、1. 同様にSharedPrefereインスタンスを生成し、getXXX(String key, XXX defaultValue)
メソッドを呼びます。1つめの引数は1. で指定した設定ファイルのキー、2つめの引数はもしそのキーに値が存在しないときに代入する初期値です。
SharedPreferences preferences = getSharedPreferences("DATA", Context.MODE_PRIVATE);
int height = preferences.getInt("HEIGHT", 150);
こんな感じでデータを保存できます。
今後はどういったケースで使用していくかをアプリ開発を通じて調べて、適宜更新していきます。