それでは、saveSettings関数の中身を作っていこう。
設定データを保存するファイル名は、「settings.json」とする(前述したように、cordova.file.dataDirectoryフォルダに置く)。この定義は、後で設定データを読み込むときにも使うので、saveSettings関数の外に記述する(次のコード)。
// 設定ファイルの名前
var settingsFileName = "settings.json";
保存するデータは、settingsオブジェクトのままでは扱いにくいので、JSONフォーマットの文字列に変換しよう(次のコード)。
function saveSettings() {
// 設定データをJSONフォーマットの文字列に変換
var jsonData = JSON.stringify(window.settings);
}
最初は設定ファイルが存在しないので、設定ファイルを作成しなければならない。ファイルを作成するには、FileプラグインのDirectoryEntryオブジェクトが必要だ。
DirectoryEntryオブジェクトを得るには、cordova.file.dataDirectoryプロパティの文字列をresolveLocalFileSystemURLメソッドに渡せばよい(次のコード)。なお、RippleエミュレータではresolveLocalFileSystemURLメソッドが動作しないので、ファイルの読み書きはできない。そのため、関数の冒頭でRippleエミュレータをチェックしている。
function saveSettings() {
if (window.isRipple)
return; // Rippleでは動作しないので、何もせずに返す
// 設定データをJSONフォーマットの文字列に変換
var jsonData = JSON.stringify(window.settings);
// dataDirectoryフォルダのDirectoryEntryオブジェクトを取得
window.resolveLocalFileSystemURL(cordova.file.dataDirectory,
// (第2引数)成功したら呼び出される関数
function success1(directoryEntry) {
console.log("saveSettings():resolveLocalFileSystemURI Success: "
+ directoryEntry.nativeURL);
// ここにDirectoryEntryオブジェクトを使ったコードを書いていく
},
// (第3引数)失敗したら呼び出される関数
function fail(error) {
console.log("saveSettings():resolveLocalFileSystemURI Error: "
+ error.code);
}
);
}
なお、上のコードで使っているconsole.logメソッドは、Visual Studioでデバッグ実行しているときには「JavaScriptコンソール」に文字列を出力する(次の画像、JavaScriptコンソールが表示されない場合は、デバッグ実行中にVisual Studioのメニュー[デバッグ]−[ウィンドウ]−[JavaScript コンソール]を選ぶ)。
DirectoryEntryオブジェクトが得られたら、そのgetFileメソッドを呼び出して設定ファイルのFileEntryオブジェクトを取得する。このとき、createオプションにtrueを指定しておくと、ファイルが存在しなかったときは作成してくれる(次のコード)。
// (resolveLocalFileSystemURLメソッドの第2引数)成功したら呼び出される関数
function success1(directoryEntry) {
console.log("saveSettings():resolveLocalFileSystemURI Success: "
+ directoryEntry.nativeURL);
// ここにDirectoryEntryオブジェクトを使ったコードを書いていく
// settingsFileNameファイルを取得(存在しないときは作成)
directoryEntry.getFile(settingsFileName, { create: true },
// (getFileの第3引数)成功したら呼び出される関数
function success2(fileEntry) {
console.log("saveSettings():directoryEntry.getFile Success: "
+ fileEntry.nativeURL);
// ここにFileEntryオブジェクトを使ったコードを書いていく
},
// (getFileの第4引数)失敗したら呼び出される関数
function fail(error) {
console.log("saveSettings():directoryEntry.getFile Error: "
+ error.code);
}
);
},
FileEntryオブジェクトが得られたら、そのcreateWriterメソッドを使うとFileWriterオブジェクトが得られる(次のコード)。このFileWriterオブジェクトは、その名前の通り、ファイルにデータを書き込むためのものだ。書き込まれるテキストのエンコーディングはUTF-8である。
// (getFileの第3引数)成功したら呼び出される関数
function success2(fileEntry) {
console.log("saveSettings():directoryEntry.getFile Success: "
+ fileEntry.nativeURL);
// ここにFileEntryオブジェクトを使ったコードを書いていく
// FileWriterオブジェクトを作成
fileEntry.createWriter(
// (第1引数)成功したら呼び出される関数
function success3(fileWriter) {
console.log("saveSettings():fileEntry.createWriter Success: "
+ fileWriter.localURL);
// ここにFileWriterオブジェクトを使ったコードを書いていく
},
// (第2引数)失敗したら呼び出される関数
function fail(error) {
console.log("saveSettings():fileEntry.createWriter Error: "
+ error.code);
}
);
},
これでようやくデータをファイルに書き込める。書き込みたい文字列を引数として、FileWriterオブジェクトのwriteメソッドを呼び出せばよい。ただし、必要ならばその前に、データ書き込みに成功したときと失敗したときのハンドラーをセットしておく(次のコード)。
// (createWriterメソッドの第1引数)成功したら呼び出される関数
function success3(fileWriter) {
console.log("saveSettings():fileEntry.createWriter Success: "
+ fileWriter.localURL);
// ここにFileWriterオブジェクトを使ったコードを書いていく
// データ書き込み後のハンドラーをセット
fileWriter.onwriteend = function (e) {
console.log('Write of file "' + settingsFileName + '" completed.');
};
// データ書き込み失敗時のハンドラーをセット
fileWriter.onerror = function (e) {
console.log('Write failed: ' + e.toString());
};
// データを書き出し
fileWriter.write(jsonData);
},
以上で、設定データがファイルに書き出されるようになった。コードの全体は、別途公開のサンプルをご覧いただきたい。ちょっと長いコードだが、順にDirectoryEntryオブジェクト→FileEntryオブジェクト→FileWriterオブジェクトと取得していって、FileWriterオブジェクトのwriteメソッドを呼び出すという流れである。
次に、書き込んだ設定を読み出して、画面に反映させよう。
Copyright© Digital Advantage Corp. All Rights Reserved.