◆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); |
【詳細】
プリファレンスを取得する
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バージョンでは正しく動作しない旨の警告があります。 |
編集用オブジェクトを取得する
prefer : プリファレンスオブジェクト
edit : 編集用オブジェクト(戻り値)
取得したプリファレンスオブジェクトを使ってデータを書き込むには、プリファレンスオブジェクトから編集用オブジェクトを取得する必要があります。
データを読み込むだけなら、編集用オブジェクトを取得する必要はありません。
データを書き込み予約する
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
key : キーワード(値に対するユニークな名前)
value : 書き込む値
edit : 編集用オブジェクト
e : 編集用オブジェクト(戻り値)
保存するデータの型に応じて、それぞれ命令が異なります。命令がいっぱいありますが、保存したい変数の型に応じて使い分けるだけなので、迷うことは無いかと思います。
put は書き込みを予約するだけであり、後述する確定命令を利用するまでは、putした値を読み出すことはできません。ここは注意してください。
KEYに与えるキーワードは、書き込むデータを一意に特定するものにして下さい。
1 2 |
edit.putFloat ("円周率", 3.14f ) ; edit.putFloat ("円周率", 12.0f ) ; |
例えば上記のようなプログラムを書くと、先に書き込んだ 3.14 が、後で書き込んだ12.0で上書きされ、「円周率」で読み込んだ時に 12.0 が戻って来てしまいます。
ここも注意が必要ですね。
文字列を書き込む命令は2種類用意されています。putString() は単純な文字列を1つだけ書き込む命令です。
1 |
edit.putString ("朝のあいさつ", "おはよう") ; |
上記のような感じで使います。
putStringSet() は Set インターフェースを実装しているクラス(HashSetなど)に格納した複数の文字列を、同じキーワードでひとまとめにして書き込む命令です。
1 2 3 4 |
Set<String> set = new HashSet<String>(); set.add("おはよう"); set.add("こんにちは"); edit.putStringSet("挨拶", set ); |
例えば上記のように使います。
put命令の戻り値に Editor オブジェクトが戻ってくるため、沢山のデータを書き込みたい場合は、以下のようにひとまとめで記述する事が可能です。これは便利ですね(笑)。
1 2 3 4 |
editor.putString("ONE", "1") .putString("TWO","2") .putString("THREE","3") .commit(); |
確定する
確定するboolean ret = edit .commit () ;
ret : 確定結果(戻り値)。Trueなら成功。それ以外は失敗
edit : 編集用オブジェクト
ファイルへの書き込みや削除を確定します。これにより、はじめてファイルに反映されます。
commit() しないと put した値を読み込む(GETする)事ができないので注意してください。
データを読み込む
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
prefer : プリファレンスオブジェクト
key : キーワード(値に対するユニークな名前)
defValue: デフォルト値
ret : 取得された値(戻り値)
読み込むデータの型に応じて、それぞれ命令が異なります。命令がいっぱいありますが、取得したい変数の型に応じて使い分けるだけなので、迷うことは無いかと思います。
put命令とは異なり、getすれば直ちに値が得られます。
KEYに与えるキーワードは、書き込み時に指定したキーワードです。キーワードが存在しない場合、
put命令と同様、文字列を読み込む命令は2種類用意されています。getString() は単純な文字列を1つだけ読み込む命令です。
1 2 3 |
editor.putString("朝のあいさつ", "おはよう"); editor.commit(); String getData = prefer.getString( "朝のあいさつ" , null ); |
例えば上記のように利用します。この例だと、getData には「おはよう」が戻ってきます。もしも読み込みに失敗したら、getData は null になります。
getStringSet() は 、あるキーワードで書き込まれた複数の文字列を、Set インターフェースを実装しているクラス(HashSetなど)にまとめて読み込む命令です。
1 2 3 4 5 6 7 8 9 10 11 |
//書き込む Set<String> set = new HashSet<String>(); set.add("おはよう"); set.add("こんにちは"); editor.putStringSet("挨拶", set ); editor.commit(); //読み込む Set<String> getData = prefer.getStringSet( "挨拶", null ); for ( String data : getData ) { Log.d( "SAMPLE", data ); } |
上記のような感じで使います。この例では、Logに「おはよう」「こんにちは」と表示されます。
値を削除予約する
key : キーワード
edit : 編集用オブジェクト
e : 編集用オブジェクト(戻り値)
KEYで指定したキーワードをもつ値を削除予約します。幾つかデータを書き込んだ状態で、特定のキーワードを持つ値だけを削除したい場合に利用します。
remove は削除予約をするだけなので、本当に削除するには remove() を実行した後でcommit() で確定する必要があります。
値を全て削除予約する
edit : 編集用オブジェクト
e : 編集用オブジェクト(戻り値)
特定のキーワードを持つ値ではなく、プリファレンスに書き込んだすべての情報を削除したい場合に利用します。
clear は削除予約をするだけなので、本当に削除するには clear() を実行した後でcommit() で確定する必要があります。
また clear はプリファレンスファイルを削除するわけではありません。プリファレンスファイルに書き込まれたデータを空にする命令となります。
キーワードがあるか検査する
prefer : プリファレンスオブジェクト
key : キーワード(値に対するユニークな名前)
ret : 検査結果(戻り値)。Trueならキーワードが存在する。それ以外なら存在しない
put の説明で記述しましたが、プリファレンスに同じキーワードで書き込みを行うと、値が上書きされてしまいます。
ありがちなミスですね(汗)。
上書きしてほしくない場合は、put する前に contains() 命令を使って、書き込むキーワードのデータがあるか検査してから処理した方が良いでしょう。
【関連記事】
サンプルプログラム
値を保存する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import java.util.HashSet; import java.util.Set; import processing.core.PApplet; import processing.event.TouchEvent; /** * PROCESSING AndroidMode SharedPreferences Sample * @author MSLABO * @version 1.0 */ public class Sketch extends PApplet { final String ITEM_FILE_NAME = "ItemList"; //ファイル名 final String KEYWORD = "勇者の持ち物"; Activity act; Context con; SharedPreferences prefer = null; //プリファレンスOBJ SharedPreferences.Editor edit = null; //編集用OBJ Set<String> itemList; //保存データ @Override public void settings() { fullScreen(); } @Override public void setup() { //ActivityとContextを取得する act = getActivity(); con = act.getApplicationContext(); //プリファレンスを取得する prefer = act.getSharedPreferences ( ITEM_FILE_NAME, Context. MODE_PRIVATE ) ; edit = prefer.edit(); } @Override public void draw() { background(200); } /** * タッチスタートイベント * @param touchEvent */ @Override public void touchStarted(TouchEvent touchEvent) { //勇者の持ち物をプリファレンスに保存する if( !prefer.contains(KEYWORD)){ //保存していない場合だけ書き込む itemList = new HashSet<String>(); itemList.add("鋼鉄の剣"); itemList.add("勇者の兜"); itemList.add("回復薬"); edit.putStringSet(KEYWORD, itemList).commit(); } super.touchStarted(touchEvent); } } |
画面をタッチすると、プリファレンスに勇者の持ち物を保存します(笑)。
<出力サンプル>
出力した結果を、AndroidStudioのデバッカーで見た様子です。
/data/data/パッケージ名/shared_prefs の下にプリファレンスファイルが作成され、指定した勇者の持ち物が保存されています。
保存した値を読み込む例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import java.util.HashSet; import java.util.Set; import processing.core.PApplet; import processing.event.TouchEvent; /** * PROCESSING AndroidMode SharedPreferences Sample * @author MSLABO * @version 2.0 */ public class Sketch extends PApplet { final String ITEM_FILE_NAME = "ItemList"; //ファイル名 final String KEYWORD = "勇者の持ち物"; final String EMPTY_DATA = "何も持っていなかった。"; final int FONT_SIZE = 24; //文字基本サイズ Activity act; Context con; SharedPreferences prefer = null; //プリファレンスOBJ SharedPreferences.Editor edit = null; //編集用OBJ Set<String> itemList = null; //取得データ Set<String> empList = null; //持ち物が無い場合の一覧 @Override public void settings() { fullScreen(); } @Override public void setup() { //ActivityとContextを取得する act = getActivity(); con = act.getApplicationContext(); //プリファレンスを取得する prefer = act.getSharedPreferences ( ITEM_FILE_NAME, Context. MODE_PRIVATE ) ; edit = prefer.edit(); //持ち物がない時のMSGデータ作成 empList = new HashSet<String>(); empList.add(EMPTY_DATA); //文字設定 textSize(FONT_SIZE * displayDensity); textAlign(LEFT, TOP); fill(0); } @Override public void draw() { background(200); //勇者の持ち物を表示する String msg = "勇者は・・・\n"; if( itemList != null ){ //なにか持っている場合、持ち物一覧を作成する for ( String item : itemList ) { msg = msg + item + "\n"; } //[持ち物無し]ではないなら、「...を持っている」という文言にする if( !itemList.toArray()[0].equals(EMPTY_DATA) ){ msg = msg + "を持っている。"; } } text( msg, 0, FONT_SIZE ); } /** * タッチスタートイベント * @param touchEvent */ @Override public void touchStarted(TouchEvent touchEvent) { //勇者の持ち物をプリファレンスから取得する //データが取得できない時は、empList を持ち物一覧にセットする itemList = prefer.getStringSet( KEYWORD, empList); super.touchStarted(touchEvent); } } |
先程保存したプリファレンスが、既に存在するという前提です。
画面をタッチすると、勇者の持ち物をプリファレンスから読み込んで表示します。
1 |
prefer.getStringSet( KEYWORD, empList); |
の KEYWORD を変更すると、プリファレンスからデータを取得できないため、デフォルトの「何も持っていなかった。」というメッセージが表示されます。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。