プリファレンスを利用するには(AndroidMode編)

◆PROCESSING 逆引きリファレンス

 カテゴリー:Web・スマホ

プリファレンスを利用するには(AndroidMode編)

【概要】

PROCESSINGにAndroidMode を導入する事で、PROCESSINGで開発したプログラムをAndroid端末上で動かす事ができるようになります。

AndroidModeの導入については「PROCESSINGをAndroid端末で動かすには(4.0版)」記事を参照してください。

アプリケーションでは、なんらかのデータを端末内に保存しておきたい場面が良くあります。

PROCESSINGには文字列情報を手軽に保存・読み込みができる saveStrings 命令と loadStrings 命令がありますが、対象が文字列データに限定されるのが難です。

例えば saveStrings 命令で float 型のデータを保存しようとすると、flost型からString型へ変換した後に保存する必要がありました。

その一方で、Androidには情報を手軽に保存・読み込みができるプリファレンスがあります。

プリファレンスでは以下の5つのデータにたいして、KEYと値をペアにして保存する事が可能です。

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

getSharedPreferences 命令でプリファレンスオブジェクト(SharedPreferences )を取得した後、保存したいデータ (DATA) 型に応じた命令を使って、値に名前 (KEY) をつけて保存します。

保存したデータ (DATA) は、保存したデータ型に応じた命令を使って、保存時に指定した名前 (KEY) を指定して読み取ります。

データ型と、保存命令・読み取り命令の対応は以下の通りです。

edit は SharedPreferences.Editor です。prefer は SharedPreferences です。詳しくは詳細を参照してください。

保存命令 読み取り命令
boolean型 edit .putBoolean(KEY, DATA); prefer.getBoolean(KEY, DEFAULT);
float型 edit .putFloat(KEY, DATA); prefer.getFloat(KEY, DEFAULT);
int型 edit .putInt(KEY, DATA); prefer.getInt(KEY, DEFAULT);
long型 edit .putLong(KEY, DATA); prefer.getLong(KEY, DEFAULT);
String型 edit .putString(KEY, DATA);
edit .putStringSet(KEY, DATA);
prefer.getString(KEY, DEFAULT);
prefer.getStringSet(KEY, DEFAULT);

 

【詳細】

プリファレンスを取得する

オブジェクト取得SharedPreferences prefer = getSharedPreferences ( String fileName,
int mode ) ;

fileName : ファイル名
mode : モード(MODE_PRIVATE)
prefer : プリファレンスオブジェクト(戻り値)

プリファレンスを使うには、getSharedPreferences 命令でプリファレンスオブジェクトを取得する必要があります。

fileName にはプリファレンス情報を格納する任意のファイル名を指定します。

ファイルは
/data/data/パッケージ名/shared_prefs  の下に作成されます。
(例:/data/data/com.example.mslabo.processingsample/shared_prefs/SaveFile.xml)

モードには以下の4つが指定可能ですが、MODE_PRIVATE以外は全て非推奨となっています。実質 MODE_PRIVATE だけが利用できると考えたほうが良いでしょう。

モード 意味
MODE_PRIVATE ファイルは、呼び出し元のアプリケーション(または同じユーザーIDを共有するすべてのアプリケーション)によってのみアクセスできます。
MODE_WORLD_READABLE 他のすべてのアプリケーションに、作成したファイルへの読み取りを許可します。この定数はAPI17で廃止されました。
MODE_WORLD_WRITEABLE 他のすべてのアプリケーションに、作成したファイルへの書き込みを許可します。この定数はAPI17で廃止されました。
MODE_MULTI_PROCESS 複数のアプリケーションでファイルを共有します。この定数はAPI23で廃止されました。また公式サイトに、一部のOSバージョンでは正しく動作しない旨の警告があります。

 

編集用オブジェクトを取得する

オブジェクト取得SharedPreferences.Editor edit  = prefer.edit () ;

prefer : プリファレンスオブジェクト
edit : 編集用オブジェクト(戻り値)

取得したプリファレンスオブジェクトを使ってデータを書き込むには、プリファレンスオブジェクトから編集用オブジェクトを取得する必要があります。

データを読み込むだけなら、編集用オブジェクトを取得する必要はありません。

 

データを書き込み予約する

予約するSharedPreferences.Editor e = edit .putBoolean (String key, boolean value) ;
SharedPreferences.Editor e = edit .putFloat (String key, float value) ;
SharedPreferences.Editor e = edit .putInt (String key, int value) ;
SharedPreferences.Editor e = edit .putLong (String key, long value) ;
SharedPreferences.Editor e = edit .putString (String key, String value) ;
SharedPreferences.Editor e = edit .putStringSet (String key, Set values) ;

key : キーワード(値に対するユニークな名前)
value : 書き込む値
edit : 編集用オブジェクト
e : 編集用オブジェクト(戻り値)

保存するデータの型に応じて、それぞれ命令が異なります。命令がいっぱいありますが、保存したい変数の型に応じて使い分けるだけなので、迷うことは無いかと思います。

put は書き込みを予約するだけであり、後述する確定命令を利用するまでは、putした値を読み出すことはできません。ここは注意してください。

KEYに与えるキーワードは、書き込むデータを一意に特定するものにして下さい。

例えば上記のようなプログラムを書くと、先に書き込んだ 3.14 が、後で書き込んだ12.0で上書きされ、「円周率」で読み込んだ時に 12.0 が戻って来てしまいます。

ここも注意が必要ですね。

文字列を書き込む命令は2種類用意されています。putString() は単純な文字列を1つだけ書き込む命令です。

上記のような感じで使います。

putStringSet() は Set インターフェースを実装しているクラス(HashSetなど)に格納した複数の文字列を、同じキーワードでひとまとめにして書き込む命令です。

例えば上記のように使います。

put命令の戻り値に Editor オブジェクトが戻ってくるため、沢山のデータを書き込みたい場合は、以下のようにひとまとめで記述する事が可能です。これは便利ですね(笑)。

 

確定する

確定するboolean ret = edit .commit () ;

ret : 確定結果(戻り値)。Trueなら成功。それ以外は失敗
edit : 編集用オブジェクト

ファイルへの書き込みや削除を確定します。これにより、はじめてファイルに反映されます。

commit()  しないと put した値を読み込む(GETする)事ができないので注意してください。

 

データを読み込む

読み込むboolean ret = prefer . getBoolean ( String key, boolean defValue ) ;
float ret = prefer . getFloat ( String key, float defValue ) ;
int ret = prefer . getInt ( String key, int defValue ) ;
long ret = prefer . getLong ( String key, long defValue ) ;
String ret = prefer . getString ( String key, String defValue ) ;
Set ret = prefer . getStringSet ( String key, Set defValues ) ;

prefer : プリファレンスオブジェクト
key : キーワード(値に対するユニークな名前)
defValue: デフォルト値
ret : 取得された値(戻り値)

読み込むデータの型に応じて、それぞれ命令が異なります。命令がいっぱいありますが、取得したい変数の型に応じて使い分けるだけなので、迷うことは無いかと思います。

put命令とは異なり、getすれば直ちに値が得られます。

KEYに与えるキーワードは、書き込み時に指定したキーワードです。キーワードが存在しない場合、defValues で指定した値が戻ってきます。

put命令と同様、文字列を読み込む命令は2種類用意されています。getString() は単純な文字列を1つだけ読み込む命令です。

例えば上記のように利用します。この例だと、getData には「おはよう」が戻ってきます。もしも読み込みに失敗したら、getData は null になります。

getStringSet() は 、あるキーワードで書き込まれた複数の文字列を、Set インターフェースを実装しているクラス(HashSetなど)にまとめて読み込む命令です。

上記のような感じで使います。この例では、Logに「おはよう」「こんにちは」と表示されます。

 

値を削除予約する

削除予約するSharedPreferences.Editor e = edit .remove ( String key ) ;

key : キーワード
edit : 編集用オブジェクト
e : 編集用オブジェクト(戻り値)

KEYで指定したキーワードをもつ値を削除予約します。幾つかデータを書き込んだ状態で、特定のキーワードを持つ値だけを削除したい場合に利用します。

remove は削除予約をするだけなので、本当に削除するには remove() を実行した後でcommit() で確定する必要があります。

 

値を全て削除予約する

全て削除予約するSharedPreferences.Editor e = edit .clear() ;

edit : 編集用オブジェクト
e : 編集用オブジェクト(戻り値)

特定のキーワードを持つ値ではなく、プリファレンスに書き込んだすべての情報を削除したい場合に利用します。

clear は削除予約をするだけなので、本当に削除するには clear() を実行した後でcommit() で確定する必要があります。

また clear はプリファレンスファイルを削除するわけではありません。プリファレンスファイルに書き込まれたデータを空にする命令となります。

 

キーワードがあるか検査する

検査するboolean ret = prefer . contains ( String key ) ;

prefer : プリファレンスオブジェクト
key : キーワード(値に対するユニークな名前)
ret : 検査結果(戻り値)。Trueならキーワードが存在する。それ以外なら存在しない

put の説明で記述しましたが、プリファレンスに同じキーワードで書き込みを行うと、値が上書きされてしまいます。

ありがちなミスですね(汗)。

上書きしてほしくない場合は、put する前に contains() 命令を使って、書き込むキーワードのデータがあるか検査してから処理した方が良いでしょう。

 

【関連記事】

 


サンプルプログラム

値を保存する例:

画面をタッチすると、プリファレンスに勇者の持ち物を保存します(笑)。

<出力サンプル>

出力した結果を、AndroidStudioのデバッカーで見た様子です。

/data/data/パッケージ名/shared_prefs  の下にプリファレンスファイルが作成され、指定した勇者の持ち物が保存されています。

 

保存した値を読み込む例:

先程保存したプリファレンスが、既に存在するという前提です。

画面をタッチすると、勇者の持ち物をプリファレンスから読み込んで表示します。

の KEYWORD を変更すると、プリファレンスからデータを取得できないため、デフォルトの「何も持っていなかった。」というメッセージが表示されます。

<出力サンプル>


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。