1

autoIncrement: trueで作成されたテーブルのインデックスを使用して、 index.openCursor(keyRange.only または keyRange.bound ここで提供) を使用して 1 つ以上のレコードにアクセスしようとしています。複数のバリエーションを試しましたが、成功しませんでした。次のコードをテンプレートとして使用した実際の例を誰かに見せてもらえますか:

window.indexedDB = window.indexedDB || window.webkitIndexedDB 
                || window.mozIndexedDB || window.msIndexedDB;
var ixDb; 

var ixDbIndexTest = function () {
  //Open or create the requested IndexedDB Database
  var ixDbRequest = window.indexedDB.open("testDBindexes", 2);

  ixDbRequest.onupgradeneeded = function (e) {
    ixDb = ixDbRequest.result || e.currentTarget.result;

    objectStore = 
      ixDb.createObjectStore("demoOS", 
                             { keyPath: "id", autoIncrement: true });
    objectStore.createIndex("ixdemo", "Field1",
                             { unique: false, multiEntry: false });

    //define new dummy record  
    var newRecord = {};
    newRecord.Field1 = "222";
    newRecord.Field2 = "333";
    newRecord.Field3 = "444";

    var request = objectStore.add(newRecord);

    request.onsuccess = function (e) {
      var index = objectStore.index('ixdemo');
      var range = IDBKeyRange.only("222");
      var cursorRequest = index.openCursor(range);

      cursorRequest.onsuccess = function(e) {    
        var cursor = cursorRequest.result || e.result; 
        alert(cursor.value);
        cursor.continue();
      }
    }
  };
};

window.onload = ixDbIndexTest;

更新: Firefox と、まだ setVersion を使用している古いバージョンの Chrome の両方で動作するように、デモ スクリプトを修正しました。ただし、現在のロジックではスクリプトが実行されるたびに setVersion が実行されるため、Chrome のバージョン チェック ロジックを追加する必要があります。

window.indexedDB = window.indexedDB || window.webkitIndexedDB 
                || window.mozIndexedDB || window.msIndexedDB;
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction 
                    || window.mozIDBTransaction || window.msIDBTransaction;
window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || 
                     window.mozIDBKeyRange || window.msIDBKeyRange;

var ixDb;     
var ixDbIndexTest = function () {
  //Open or create the requested IndexedDB Database
  var ixDbRequest = window.indexedDB.open("testDBindexes", 1);

  ixDbRequest.onsuccess = function(e) {
    ixDb = ixDbRequest.result || e.currentTarget.result;

    if (typeof ixDb.setVersion === "function") {
      ixDbVersionRequest = ixDb.setVersion(1);

      ixDbVersionRequest.onsuccess = function (e) {
        indexTest();
      };
     }
     else {
       ixDbRequest.onupgradeneeded = function (e) {
       indexTest(); 
       };
     }
   }
 };

window.onload = ixDbIndexTest;

function indexTest() {
  var objectStore = ixDb.createObjectStore("demoOS", 
                           { keyPath: "id", autoIncrement: true });
  objectStore.createIndex("ixdemo", "Field1", 
                           { unique: false, multiEntry: false });

  //define new record with users input 
  var newRecord = {};
  newRecord.Field1 = "222";
  newRecord.Field2 = "333";
  newRecord.Field3 = "444";

  var request = objectStore.add(newRecord);

  request.onsuccess = function (e) {
    var index = objectStore.index('ixdemo');
    var range = IDBKeyRange.only("222");
    var cursorRequest = index.openCursor();

    cursorRequest.onsuccess = function(e) {    
      var cursor = cursorRequest.result || e.result; 
      if(cursor) {
        alert(JSON.stringify(cursor.value));
        cursor.continue();
      }
    }
  }
}
4

2 に答える 2

4

エラーメッセージType Error: cursor is undefinedは、カーソルが定義されているかどうかを確認せずにカーソルを使用しているために発生します。したがって、cursor.continue()IndexedDBにデータベース内の次のオブジェクトを取得するように指示すると、実際に存在する唯一のオブジェクトを使い果たした後、カーソルは未定義になります。

したがって、このようなことを行う必要があります。コードでは、次のようになります。

      cursorRequest.onsuccess = function(e) {    
        var cursor = cursorRequest.result || e.result;
        if (cursor) {
          alert(cursor.value);
          cursor.continue();
        }
      }

また、(を使用する場合のように)1つのオブジェクトのみを探していることがわかっている場合は、その部分IDBKeyRange.onlyを省略できます。cursor.continue()

      cursorRequest.onsuccess = function(e) {    
        var cursor = cursorRequest.result || e.result;
        alert(cursor.value);
      }

Chromeの問題については、これまでFirefoxにのみ焦点を当ててきたため、サポートできません。Chromeの最新の開発バージョンを試してみることをお勧めします。これはonupgradeneeded、他のさまざまな更新と一緒に実際にサポートされていますが、これまでのテストではまだかなりバグがあり、Firefoxで動作するコードはChromeで失敗する可能性があります。これが緊急のプロジェクトでない場合は、Chromeが安定するまでしばらく待つ方がよい場合があります。

于 2012-09-03T19:33:17.397 に答える
0

onupgardeneded イベント中はレコードを追加できません。

変更後は、データベースを再度開いて、新しい objectStore スキーマを取得する必要があります。したがって、2つが開きます

現在のクロムは、まだ古い標準だと思いますが、setVersion、onupgardeneded は呼び出されません。

newRecord には keyPath 'id' が必要です。オブジェクト ストアの作成時に keyPath を指定しないでください。

于 2012-09-03T15:05:21.680 に答える