無料ブログはココログ

« ピッカーダイアログによる日時の入力 | トップページ | プリファレンスアクティビティ »

2013年9月25日 (水)

プリファレンス

Preference アプリ固有の設定情報を不揮発性で記憶するのに、簡単なものだったら「プリファレンス」という(正確には「共有プリファレンス」らしい)機構が使える。Windowsだったら自前で*.iniファイルあるいはレジストリに記録するところだが、この点Androidは便利だと思った。
 さらには、ダイアログを開いてユーザと対話してプリファレンスのデータを編集し結果を記入してくれるAPIも用意されていて驚いた(そちらは次の記事に)。

 プリファレンス(Javaクラス名は「SharedPreferences」)が最終的に記入される先はファイルのようだ。最初に(Javaレベルでは)インスタンスを生成する必要があり、このときファイル名とアクセスモードを指定する。このあたりはMindでの手順も同様とした。

 今までの記事でも書いたことだが、Javaのクラスインスタンス(オブジェクト)をMindで得てもあまり意味がない。レイアウトなどでは生成したオブジェクトを大域配列に記憶し、Java←→Mindはその配列要素番号で連携をとったたが、今回の場合、複数のプリファレンスを同時に処理する場面は想定しずらいと考え、オブジェクトは配列にはせずJava側で単一の大域変数に格納、それを暗黙の了解で扱うようにしてJava←→Mindのインターフェースを単純化した。

プリファレンスの生成

 Mindでの記述は以下の通りである。

    (文法)
        <ファイル名>と <パーミッション>で プリファレンスを獲得
                                                         → [ErrorMessage]、真偽


    (ソース例)
        "testdb"と MODE_PRIVATEで プリファレンスを獲得し 偽?
                ならば 重大エラー
                つぎに


 上記にある「パーミッション」は、同じアクティビティ内であるいは同一パッケージ内アクティビティ同士で共用すれば済む場合は定数「MODE_PRIVATE」を指定する。(定数を日本語名にするか考えたがとりあえずJavaと同名の英語にした)
 なお、プリファレンスの生成のあと書き込みをおこなうのか、読み出しをおこなうのかはこの段階では区別する必要はない。(このあと書き込み処理をおこなえば書き込みとなる)

エディタの割り当て(書き込み時)

 書き込みを行うには、一連の書き込みの前に一度だけ、プリファレンスに対して「エディタ」(Javaでは SharedPreferences.Editor クラス)を割り当てる必要がある。プリファレンス本体のオブジェクト維持と同様にエディタのクラスインスタンスもJava側大域変数に格納するためMindからエディタを特定する情報は無い。

    (文法)
        プリファレンスのエディタを割り当て → [ErrorMessage]、真偽

    (ソース例)
        プリファレンスのエディタを割り当て 偽?
                ならば 重大エラー
                つぎに


データの書き込み

 プリファレンスに記入するデータは必ず<キー>と<値>の対である。キーは常に文字列だが、値は論理値/整数/文字列のように種類がある。Mind側でも値のデータ型に応じて複数の処理単語を設置した。またJavaでは書き込み時にエディタを指定するのだが前述の通り暗黙のオブジェクトとしたためMindでは指定しない。

    (文法)
        <キー>と <値(1/0)>を プリファレンスに論理値を書き込み
                                                         → [ErrorMessage]、真偽
        <キー>と <値(整数)>を プリファレンスに整数を書き込み
                                                         → [ErrorMessage]、真偽
        <キー>と <値(文字列)>を プリファレンスに文字列を書き込み
                                                         → [ErrorMessage]、真偽

        <キー>と <デフォルト値(1/0)>で プリファレンスの論理値を読み出し
                                                → <値(1/0)|ErrorMessage>、真偽
        <キー>と <デフォルト値(整数)>で プリファレンスの整数を読み出し
                                                → <値(整数)|ErrorMessage>、真偽
        <キー>と <デフォルト値(文字列)>で プリファレンスの文字列を読み出し
                                                → <値(文字列)|ErrorMessage>、真偽


    (ソース例(書き込み))
        "age"と 62を プリファレンスに整数を書き込み 偽?
                ならば 重大エラー
                つぎに


    (ソース例(読み出し))
        "name"と 空列で プリファレンスの文字列を読み出し 偽?
                ならば 重大エラー
                つぎに
        氏名に 入れ


 論理値の書き込みは、Mindで論理値は「ゼロ/非ゼロ」で判定される整数として扱っているがJavaでは論理値自身がデータ型なので両者間で型変換をおこなっている。
 Mindへの実装では当初は論理値の読み書きは含めず「~に整数を書き込み」「~の整数を読み出し」で代用すれば可と思っていた。しかし後述するプリファレンス・アクティビティにおいて、論理値を扱うAPIがあるため仕方なく設置したものである。
 読み出し操作で指定するデフォルト値は、指定したファイルが存在しないか、指定したキーが存在しない場合、ここで指定した値を読み出し値とみなして返すために使われる。

コミット

 これはデータベースの用語だが手続きもデータベース流になっている。一連の書き込みのあと、コミットをおこなうことで実際にファイルに書き込まれる。(割り当てたエディタはその後明に開放する)

    (ソース例)
        プリファレンスをコミットし 偽?
                ならば 重大エラー
                つぎに


プリファレンスとエディタの開放

 Java側にそのようなAPIは無いがあえてMindに実装した。以下を実行することでJava側の大域変数にnullを記入することでメモリ開放するためである。(後者はアプリ終了時にも自動実行される)

    (ソース例)
        プリファレンスのエディタを開放し 偽?
                ならば 重大エラー
                つぎに
        プリファレンスを開放し 偽?
                ならば 重大エラー
                つぎに



参考URL: 「日本語プログラミング言語Mind」 (スクリプツ・ラボ)

« ピッカーダイアログによる日時の入力 | トップページ | プリファレンスアクティビティ »

Android」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/100109/58262858

この記事へのトラックバック一覧です: プリファレンス:

« ピッカーダイアログによる日時の入力 | トップページ | プリファレンスアクティビティ »