首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从桌面Chrome IndexedDB vs从android Chrome IndexedDB删除记录

从桌面Chrome IndexedDB vs从android Chrome IndexedDB删除记录
EN

Stack Overflow用户
提问于 2012-10-18 04:12:21
回答 2查看 1.9K关注 0票数 0

我正在尝试使用休眠代码从IndexedDB中删除记录:

代码语言:javascript
复制
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并使用休眠代码搜索记录时:

代码语言:javascript
复制
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无法将其删除,因为它实际上已被删除。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-18 12:56:10

不如直接打开键光标,而不是实际检索它。

代码语言:javascript
复制
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>";
    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-10-19 02:53:23

这里的问题是同时有多个事务在运行-我可以告诉你这是因为idelete()不返回它创建的事务,所以没有办法保证readAll()在idelete()之后执行。

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

代码语言:javascript
复制
foo = idelete(....).oncomplete = function() { readAll()...}

我认为它碰巧在android上工作的事实只是chrome实现的一个偶然事件(chrome在android上是单进程的,所以事件倾向于在那里更串行地运行)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12942581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档