How to use of changeVersion その2

前回のエントリで、以下のように記述しましたが、NGでした。

  • openDatabaseにpostVerを指定し、changeVersion(preVer, postVer, callback)を呼ぶと、currentVersionと引数が違う、というエラーが出る
    • current version of the database and `oldVersion` argument do not match

後者は、changeVersionの第4引数を以下のようにしてスルーすれば回避できるでしょう。

		function(error){
			window.console.log("(initDb)db error:" + error.message);
			callback_success();
		},

理由は、changeVersionの第4引数で指定したエラーハンドラ内でさらにtransactionを実行するとエラーになります。上記コードの場合、callback_success()の中でtransactionを実行するとNGです。試したのはChrome(6.0.472.62)のみです。
openDatabase関数の戻り値であるdatabaseオブジェクトには「version」というプロパティがあるので、それを見てバージョンアップが必要な場合だけchangeVersionを実行するようにすれば問題ありませんでした。

function initDb(callback_success){
	var db = getDbConnection();
	if(db.version == "1.0"){
		db.changeVersion("1.0", "1.1",
			function(t){
				t.executeSql('CREATE TABLE cal_events_new(id INTEGER PRIMARY KEY, server_key TEXT, year INTEGER, month INTEGER, day INTEGER, start TEXT, end TEXT, title TEXT, body TEXT)');
				//t.executeSql('INSERT INTO cal_events_new(id, year, month, day, title) SELECT id, year, month, day, title FROM cal_events');
				t.executeSql('DROP TABLE IF EXISTS cal_events');
				t.executeSql('ALTER TABLE cal_events_new RENAME TO cal_events');
			},
			function(error){
				alert("(initDb)db error:" + error.message);
			},
			callback_success
		);
	}else{
		callback_success();
	}
}