プリファレンスを使用したデータの保存:Androidアプリケーション開発者のためのTips集(16)
Androidアプリ開発者のためのTips集。今回は、アプリごとの情報を保存するための仕組み「プリファレンス」についてだ。サンプルアプリの実装例を見ながら使用方法をマスターしよう。
Tips概要と動作検証環境
用途 | 基本 |
---|---|
カテゴリ | データI/O |
レベル | 初級 |
動作確認環境 | Android 2.3.3(GingerBread) エミュレータにて動作確認 |
備考 | 今回のTipsは上記環境で動作確認・検証を行っています |
Tips 16:プリファレンスを使用したデータの保存
設定変更や中断時の状態など、アプリごとに保存しておきたい情報がある。このようなアプリごとの情報を保存するために、Androidには「プリファレンス」という仕組みが用意されている。
今回は、このプリファレンスの使い方について紹介する。
プリファレンス概要
プリファレンスとは前述の通り、データ保存のための仕組みのことで、“キー”と“値”の組み合わせによって任意のデータを保存/復元(読み込み)できる。
プリファレンスの内部は、テキストファイル(といってもXMLだが)の読み書きを使って実装されているので、複雑なデータは保存できない。そのため、アプリの設定情報などのような比較的単純なデータの保存に用いられる。
プリファレンスでは、以下の種類のデータを保存できる。
- int
- long
- float
- boolean
- String
使用例
今回、プリファレンスを使ったデータの保存/読み込みの例として、簡単なアプリを作ってみた。
ここで紹介するのは、「名前」と「年齢」に応じてメッセージを返してくれるアプリだ。起動時に名前と年齢を登録し、保存(画像1)。既にその名前と年齢が登録されていたら、ユーザーにあいさつのメッセージを表示する。メッセージの内容は、ユーザーの年齢が10歳未満、10〜29歳、それより上の場合で異なるものを表示する(画像2、3、4)。
このアプリの動作の流れは以下の通りだ。
- プリファレンスに「名前」と「年齢」が登録されているかどうかを確認する
- 「名前」と「年齢」が両方登録されていたら、あいさつメッセージを表示して終了する
- どちらか一方でも登録されていなければ、登録用のUIを表示。ユーザーに入力してもらった内容をプリファレンスに登録する(1.に戻る)
プリファレンスへのデータの保存
まず、プリファレンスにデータを保存する手順を見てみよう。今回のアプリでは、以下のように実装した。
/** 入力された「名前」を「年齢」をプリファレンスに保存する */ public void saveNameAndAge( Context context, String name, int age ){ // プリファレンスの準備 // SharedPreferences pref = context.getSharedPreferences( "name_and_age", Context.MODE_PRIVATE ); // プリファレンスに書き込むためのEditorオブジェクト取得 // Editor editor = pref.edit(); // "user_name" というキーで名前を登録 editor.putString( "user_name", name ); // "user_age" というキーで年齢を登録 editor.putInt( "user_age", age ); // 書き込みの確定(実際にファイルに書き込む) editor.commit(); }
プリファレンスへの読み書きに使用するSharedPreferenceオブジェクトは、ContextクラスのgetSharedPreferences()メソッドを使用して取得する。この時の第1引数はファイル名、第2引数はファイルの読み書き権限に関するモード指定だ。
第1引数のファイル名はデータを読み書きするファイル名で、指定したファイルが存在しない場合は、自動的にそのファイルを作成してくれる。ファイルはアプリ個別のデータ置き場に保持されるので、他のアプリとファイル名がかぶる心配はない。
1つのアプリの中でもファイル名を変えて複数のプリファレンスを使用できる。今回は、ユーザーの名前と年齢を保存するために“name_and_age”というファイル名を指定した。
第2引数のモード指定は、このプリファレンスをこのアプリだけで使用するか、他のアプリからも読み書きできるようにするかという指定だ。普通は「Context.MODE_PRIVATE(このアプリの中でのみ使用する)」を指定する。「Context.MODE_WORLD_READABLE」を指定すると他のアプリでも読み込み可能となり、「Context.MODE_WORLD_WRITEABLE」を指定すると他のアプリからでも読み書き可能になる。なお、他のアプリからの読み書き方法についての説明については、今回は割愛する。
プリファレンスに書き込む際は、SharedPreferenceオブジェクトのedit()メソッドを使用してEditorを取得し、putXXX()メソッドを使用して書き込みを行う。
putXXX()メソッドは、書き込む値によって以下の5種類が用意されている。
- putInt()
- putLong()
- putFloat()
- putString()
- putBoolean()
いずれのメソッドでも、後で設定値を取り出すためのキー名と、設定値そのものを指定する。
ただし、putXXX()メソッドの段階では実際にファイルへの書き込みは行われない。最後に、commit()メソッドでファイルへの書き込みを実行する必要がある。
プリファレンスからのデータの読み出し
次に、プリファレンスからデータを読み出す手順を見てみよう。今回のアプリでは、以下のように実装した。
/** プリファレンスから「名前」を取り出す。登録されていなければ空の文字列を返す */ public String loadName( Context context ){ // プリファレンスの準備 // SharedPreferences pref = context.getSharedPreferences( "name_and_age", Context.MODE_PRIVATE ); // "user_name" というキーで保存されている値を読み出す return pref.getString( "user_name", "" ); } /** プリファレンスから「年齢」を取り出す。登録されていなければ -1 を返す */ public int loadAge( Context context ){ // プリファレンスの準備 // SharedPreferences pref = context.getSharedPreferences( "name_and_age", Context.MODE_PRIVATE ); // "user_age" というキーで保存されている値を読み出す return pref.getInt( "user_age", -1 ); }
読み出しの手順は保存の時より簡単だ。まず、SharedPreferenceオブジェクトを取得するのは保存する時と同じ。後は、SharedPreferenceのgetXXX()メソッドを使って値を読み出しているだけだ。
注意点としては、当然といえば当然だが、保存した時と同じファイル名を指定してSharedPreferenceを取得することと、保存した時と同じキー名を使って値を読み出すことだ。
getXXX()メソッドも、putXXX()と同じく以下の5種類が用意されている。
- getInt()
- getLong()
- getFloat()
- getString()
- getBoolean()
putXXX()の時と違うのは、第2引数に「デフォルト値」を指定できることだ。指定したキー名に対して値が保存されていなかった場合は、第2引数で指定した値が読み出した値として返される。
アプリ実行結果
実行結果は以下のようになる。名前と年齢を登録した後でいったんアプリを終了・再起動すると、保存した名前と年齢がプリファレンスから正しく読み出される。
≫連載「Androidアプリケーション開発者のためのTips集」の目次
Copyright © ITmedia, Inc. All Rights Reserved.