2012-04-07 11 views
1

私はChromeでブックマーク拡張を作成しようとしています.WebSQLを利用してブックマークに関するすべての種類の情報をローカルに保存したいと考えています。ここで私はこれまで何をやったかです:WebSQL changeVersionは常に失敗します

(function() { 
    var Home, 
    __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; 

    window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; 

    Home = (function() { 

    function Home() { 
     this.onDBInit = __bind(this.onDBInit, this);  this.db = openDatabase("Journal", "", "Bookmarks Stats", 5 * 1024 * 1024, this.onDBInit, this.onDBError); 
    } 

    Home.prototype.onDBInit = function(db) { 
     console.log(db.version); 
     db.changeVersion("", "1.0", this.initDB, this.onDBError); 
     return console.log(db); 
    }; 

    Home.prototype.initDB = function(t) { 
     console.log(t); 
     return t.executeSql('CREATE TABLE bookmarks (id, title, url)'); 
    }; 

    Home.prototype.onDBError = function(e) { 
     return console.log(e); 
    }; 

    return Home; 

    })(); 

    window.Registerable(Home); 

}).call(this); 

何らかの理由で、changeVersion は常には失敗します。私はデータベースを削除して、Chromeを再起動しようとしました。Chromeバージョン:18.

+0

解決済みですか? –

+0

私はやったと思う..それは長すぎる。最初の引数は "1.0"のようなものでなければならないと思います...とにかく、webSQLは廃止予定です。indexedDBのような他の方法を試してみてください。http://www.w3.org/TR/IndexedDB/ –

答えて

0

私の限られた経験では、changeVersionはChromeで動作します。また、Safariで正しく動作しないという苦情hereも読んだことがありますが、それはありません。

キャッチ1:

は、しかし、2つのキャッチがある

多くの場合、changeVersion が失敗するを表示されます(それがエラーを与え、db.versionはまだ古い値を返します)が、トランザクションコールバックが発生し、Webページとそのデータベースを再オープンすると、バージョン番号が正しいことになります。

キャッチ2:

あなたが3つのコールバックを含め、正確に5つの引数を供給しなければならないようです。これらの5つの引数を指定しないと、最初の3つの引数だけを実行するなど、現在のバージョンは変更されません。ですから、もし皆さんが参照しているthis tutorialの指示に従えば、あなたは失望します。

これは、WindowsのChromeとSafariの場合です。

引数は以下のとおりです。 1:予想バージョン 2:新しいバージョン 3:トランザクションコールバック(あなたはバージョン変更の一環として、ここではSQLを実行することができます) 4:障害コールバック(バージョン変更またはトランザクションコールバックが失敗した場合) 5:大成功コールバック(バージョン変更とトランザクションコールバックが成功した場合)

私はiOSデバイスでこれをテストしていないが、それはここで提供Safariの仕様に合致する:で ​​

Opera、changeVersionは、executeSqlを使用して実際のSQLトランザクションを実行するまで、db.versionを新しい値に設定して待機します。だから私はそれ以上の結果を持っていないSELECTステートメントを使用します。これは実際にはトランザクションコールバックの中にある必要はありません。changeVersionコマンドを一式試した後、ブラウザコンソールで別のexecuteSqlステートメントを試したときにそれを発見しました。

+0

回答ありがとうございます。私は何をしたのか覚えていないが、これは鐘を鳴らす(5つの引数は必須) –

0

これはChromeのバグです。値の空の文字列を使用してデータベースのバージョンを変更することはできません。データベースの

(あなたのケースでは、機能onDBInit)呼び出しcreationCallbackで

そしてspecificationsに従ってバージョンは、空の文字列にさらされている:

コールバックは、空の文字列を有するデータベースで呼び出されますかかわらず、このエラーは、2年前とdescribed in detail検出されたが、それでも を補正しない

指定されたデータベース・バージョンのそのバージョンとして、 0私はこの問題を次のように決めました。creationCallbackのデータベース構造の初期化を取り除き、データベースへの最初のトランザクションにしました。

var db = openDatabase("Journal", "0.1", "Bookmarks Stats", 5 * 1024 * 1024); 
db.transaction(function (t) { 
    t.executeSql('CREATE TABLE IF NOT EXISTS bookmarks (id, title, url)'); 
}); 
関連する問題