0

次のコードを使用して、IndexedDB からレコードを削除しようとしています。

DB.indexedDB.IDBTransaction.READ_WRITE="readwrite";
window.indexedDB =  window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB;

if ('webkitIndexedDB' in window) {
        window.IDBTransaction = window.webkitIDBTransaction;
        window.IDBKeyRange = window.webkitIDBKeyRange;
        DB.indexedDB.IDBTransaction.READ_WRITE=IDBTransaction.READ_WRITE;
    }

DB.indexedDB.idelete = function( storeName, indexValue, index, keyPathfield ){
    var db = DB.indexedDB.db;
    var transaction = db.transaction([storeName], DB.indexedDB.IDBTransaction.READ_WRITE);
    var store = transaction.objectStore(storeName);
    var sindex = store.index(index);

    sindex.get(indexValue).onsuccess = function (event){
        store.delete(event.target.result[keyPathfield]).onsuccess = function(event) {
            document.getElementById("result").innerHTML+="deleted<br>";
            };
        }
}

それは呼び出しますonsuccessが、同じレコードを追加して再度indexValue呼び出しidelete、次のコードを使用してレコードを検索すると:

DB.indexedDB.readAll=function(storeName, index){
    var results=document.getElementById("result");
    var db = DB.indexedDB.db;
    var transaction = db.transaction([storeName]);
    var store = transaction.objectStore(storeName);
    var key = IDBKeyRange.lowerBound(0);
    var cursor = store.openCursor(key);
    var x=0;

    cursor.onsuccess = function(event){
        var result = event.target.result;
        if(result)
        {
            x++;
            var charx=x.toString();
            results.innerHTML+=charx+result.value[index]+"<br>";
            result.continue();
        }
        else 
        return;
}

Windows Chrome を使用している場合、レコードは正しく削除されます。しかし、Android Chrome バージョン M18.1 を使用している場合readAll、レコードを見つけることはできますが、idelete実際には削除されているため削除できません。

4

2 に答える 2

1

実際に取得するのではなく、キーカーソルを開くだけではどうですか。

sindex.openKeyCursor(indexValue).onsuccess = function (event){
    var cursor = event.target.result;
    if (cursor) {
      // cursor.delete(); 
      var key = cursor.key;
      var primaryKey = cursor.primaryKey;

      store.delete(primaryKey).onsuccess = function(event) {
        document.getElementById("result").innerHTML+= key + ' (' + primaryKey + ") deleted<br>";
        };
      }
    } else {
      document.getElementById("result").innerHTML+= indexValue + ' not found.<br>";
    }
}
于 2012-10-18T04:56:09.583 に答える
1

ここでの問題は、一度に複数のトランザクションが進行中であることです。これは、idelete() が作成したトランザクションを返さないため、idelete() の後に readAll() が実行されることを保証する方法がないことがわかります。

代わりに、idelete() でトランザクションを返してから、それを処理する必要があります。

foo = idelete(....).oncomplete = function() { readAll()...}

Androidでたまたま機能するという事実は、chromeの実装のまぐれに過ぎないと思います(Androidでは単一プロセスであるため、イベントはそこでよりシリアルに実行される傾向があります)

于 2012-10-18T18:53:23.267 に答える