1

indexeddb に問題があります - この方法を使用して、db を開いてセットアップしています

DBService.prototype.open = function (dbName, entity, cb) {
  var self = this;
  var req = indexedDB.open(dbName)
  req.onsuccess = function(e) {
    var v = 1;
    DBService.storage.db = e.target.result;
    var db = DBService.storage.db;
    // We can only create Object stores in a setVersion transaction;
    if (v != db.version) {
      var setVrequest = db.setVersion(v);

      setVrequest.onerror = function (err, stack) {
        console.log(err, stack);
      }

      setVrequest.onsuccess = function(e) {
        if(db.objectStoreNames.contains(entity)) {
          db.deleteObjectStore(entity);
        }

        var store = db.createObjectStore(entity,
          {keyPath: "timeStamp"});
        e.target.transaction.oncomplete = function() {
          console.log(db);
          cb(db);
        };
      };
    } else {
      cb(db);
      /*
      req.transaction.oncomplete = function() {
        cb(db);
      */
    }
  };

  req.onerror = function (err, stack) {
    console.log(err)
    console.log(stack)
  }
};

データベースが開かれていない場合を除いて、すべてがうまく機能します。私はまだ得ています

InvalidStateError: DOM IDBDatabase Exception 11

(console.log req.error の場合)

私はこのコードがかなり汚れていることを知っています。私はすべてを試しています。うまく機能するようになったら、リファクタリングすることをお約束します!

ありがとうございました!

4

2 に答える 2

3

他のブラウザーは setVersion をサポートしていないため、このページを chrome でのみ使用していると思います。

「データベースが開かれていない場合を除いて、すべてがうまく機能します。」 とはどういう意味ですか? db.open 呼び出しが失敗し、req.onerror が呼び出されることがありますか? どのような場合でも、エラー イベント ハンドラは 1 つのパラメータのみを受け取る必要があり、スタックではなくエラーのみが渡されます。

InvalidStateError: DOM IDBDatabase Exception 11 例外の一般的な原因の 1 つは、リクエスト オブジェクトがイベントを受け取る前に req.error にアクセスすることです。たとえば、次のコードは例外 11 をスローします。

var request = indexedDB.open("some db");
console.log(request.error);

一方

var request = indexedDB.open("some db");
request.onerror = request.onsuccess = function(e) { console.log(request.error); };

例外をスローしません。

setVrequest.onblocked = function(e) { console.log("got blocked:" + e); };ブロックされたイベントが問題を引き起こしている可能性があるかどうかを知るために、追加することもできます.

于 2012-09-01T08:57:08.957 に答える
1

「InvalidStateError:DOM IDBDatabase Exception 11」のもう1つの原因は、ChromeのsetVersion操作内で別のトランザクションを実行しようとした場合です。通常、データベースが作成/アップグレードされた直後にデータが入力されます。

setVersionの完了後にデータを入力する必要がある場合は、このパターンを使用する必要があります。そうしないと、その例外が発生します。奇妙なことに、Chrome 22でも、拡張機能がChromeストアにリリースされた後にのみこれが表示されました。

次のパターンを使用してください。

https://groups.google.com/a/chromium.org/forum/#!msg/chromium-html5/VlWI87JFKMk/6GWbB_HvxtsJ

db.setVersion('3').onsuccess = function(event) {
var transaction = event.result;
transaction.oncomplete = function() {
  db.transaction('mystore', 'readwrite').onsuccess = populateDataStore;
 };
}
于 2012-11-15T21:37:08.550 に答える