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() 不会返回它创建的事务,所以无法保证 readAll() 在 idelete() 之后执行。

相反,您需要让 ielete() 返回事务,然后处理它:

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

我认为它恰好在android中工作的事实只是chrome实现的侥幸(这是android上的单进程,所以事件往往在那里更连续地运行)

于 2012-10-18T18:53:23.267 回答