1

Chrome で使用する indexeddb ストレージをセットアップしようとしています。しかし、トランザクション Uncaught TypeErrorを設定しようとするとエラーが発生します。READ_WRITE

webkitIDB の使用に関する適切な最新情報を見つけることができませんでした。だから私は基本的にここで盲目的に飛んでいます。私が間違ったことをしたアイデアはありますか?私が見逃したこれについての良い話はありますか?

設定:

function OfflineStorage() {
  this.saveJSONString = __bind(this.saveJSONString, this);
  var request,
    _this = this;
  this.dbkeyRange = window.webkitIDBKeyRange;
  this.dbTransaction = window.webkitIDBTransaction;
  this.db = window.webkitIndexedDB;
  request = this.db.open("lucidFrog");
  request.onsuccess = function(e) {
    _this.db = e.target.result;
    return _this.setupDB(); //setupDB() ensures the objectStores have been created.
  };
}    

保存機能:

OfflineStorage.prototype.saveJSONString = function(objectStore, json_string, obj_id) {
  var request, store, transaction;

  //PROBLEM AREA, gives "Uncaught TypeError: Type error"
  transaction = this.db.transaction([objectStore], this.dbTransaction.READ_WRITE, 0);
  ////////////////////

  store = transaction.objectStore(objectStore);
  request = store.put({
    "json": json_string,
    "id": obj_id
  });
  request.onsuccess = function(e) {
    return console.log("YYYYYYEEEEEAAAAAHHHHHH!!!");
  };
};

要求objectStoreされたが作成され、this.dbTransaction定義されていることが確認されました。

4

1 に答える 1

5

これは、オブジェクト ストアからスローされた IndexedDB エラーではなく、セットアップの何かです。objectStoreこの種のエラーは、間違ったオブジェクト型を呼び出しに渡すとスローされます。そのため、 var が実際には文字列ではないことが最初に推測されました。

排除に基づいて、this.db は未定義ではありません (それ以外の場合、トランザクションでエラーが発生します)。トランザクションは関数です (それ以外の場合、非関数呼び出しがスローされます)。したがって、 this.dbTransaction.READ_WRITE は問題なく 1 を返すはずだと推測する必要があります (これを再確認してください)。

したがって、これが問題を引き起こしている 3 番目のパラメーターであると強く疑われます。仕様に示されている 3 番目のパラメーター (オプションのtimeout ) を使用したことがないことは確かであり、デフォルトのタイムアウトは既に 0 (無期限) であるため、ここでは不要であると考えています。その行を次のように変更して、動作するかどうかを確認できますか?

トランザクション = this.db.transaction([objectStore], this.dbTransaction.READ_WRITE);

更新: バージョン定数は非推奨になったことに注意してください。これらの数値の代わりに、"readwrite"、"readonly"、または "versionchange" という文字列を渡す必要があります。

于 2012-03-20T22:22:59.230 に答える