Windowsストアアプリに挑戦(その4・アプリデータの保存)

アプリケーションが終了する際にデータを保存して、次回に起動する時にそのデータを復元することは、一般的な処理です。
Windowsストアアプリでは、「アプリデータ」と「セッションデータ」の2通りのデータを保存することができます。
今日は、アプリデータの保存と復元の方法を紹介します。

1.アプリデータの保存

アプリデータは、大まかに言えば、ユーザーが意図的にアプリを終了したときに、保存しておきたいデータです。
アプリデータの保存は、以下のようなコードで行うことができます。
「キー」で保存したいデータの名前を指定します。

var appData = Windows.Storage.ApplicationData.current;
var roamingSettings = appData.roamingSettings;
roamingSettings.values["キー"] = 値;

アプリデータの保存は、アプリが終了する直前に行うこともできます。
ただ、終了直前の処理は5秒間しか行うことができません。
そこで、終了直前ではなく、データに変化があったらその都度保存するようにします。

たとえば、以前に紹介したHello, Worldメッセージのアプリの場合だと、「送信」ボタンがクリックされた時点で、ユーザー名をアプリデータに保存することが考えられます。
そこで、「送信」ボタンのイベントハンドラに、アプリデータを保存する処理を追加します。

以下のリストの7~9行目が追加した部分です。
ユーザー名を「userName」というアプリデータに保存しています。

function clickHandler(e) {
    var u = document.getElementById('user').value;
    if (u) {
        var msg = 'Hello, ' + u;
        document.getElementById('msg').innerHTML = msg;

        var appData = Windows.Storage.ApplicationData.current;
        var roamingSettings = appData.roamingSettings;
        roamingSettings.values["userName"] = u;
    }
    else {
        var alt = new Windows.UI.Popups.MessageDialog('名前を入力してください。');
        alt.showAsync();
    }
}

2.アプリデータの復元

アプリデータの復元は、Activatedイベントのハンドラの中で行います。
アプリデータの保存のときと同様にしてroamingSettingsを得て、そこからデータを読み込みます。

Hello,Worldアプリの場合だと、Activatedイベントハンドラを以下のように書き換えます。
12~19行目が、アプリデータを復元する処理です。

12~14行目で、アプリデータの「userData」(ユーザー名)を、変数uに読み込みます。
そして、変数uに値があれば、input要素にそのユーザー名をセットし(16行目)、またメッセージも書き換えます(17~18行目)。

app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
            // TODO: このアプリケーションは新しく起動しました。ここでアプリケーションを
            // 初期化します。
        } else {
            // TODO: このアプリケーションは中断状態から再度アクティブ化されました。
            // ここでアプリケーションの状態を復元します。
        }
        args.setPromise(WinJS.UI.processAll());

        var appData = Windows.Storage.ApplicationData.current;
        var roamingSettings = appData.roamingSettings;
        var u = roamingSettings.values["userName"];
        if (u) {
            document.getElementById('user').value = u;
            var msg = 'Hello, ' + u;
            document.getElementById('msg').innerHTML = msg;
        }

        var btn = document.getElementById('send');
        btn.addEventListener('click', clickHandler, false);
    }
};

3.「Windowsストアアプリに挑戦」の記事の一覧

「Windowsストアアプリに挑戦」のその他の記事は、以下のリンクから参照できます。