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(); } }