2012-01-06 34 views

回答

0

因为我无法找到任何东西,所以这是我所已到位现在,它对我的​​目的非常有用。这是一种黑客,我对它不满意,但是,嘿,现在,这是可以做到的。

我只是存储一行,因为我需要在该数据库中。在阅读后,我得到所有行并执行我需要的操作,这只是一行。当我插入一个新行时,我只是清除整个数据库,这又是一行,并在其中插入一个新行。

@spiderdevil,我刚刚看到了你的答案,我不确定我是否能够尝试中止交易,但如果它确实适用于其他人,请在评论中分享。

0

排序的黑客,但我相信,如果你不在结果对象上调用continue()它只会处理第一个项目。

下面是使用游标查询并仅处理一个结果的快速示例。

var db = _IndexedDatabase; 
var trans = db.transaction(["Sites"], IDBTransaction.READ_ONLY); 
var store = trans.objectStore("Sites"); 
var request = store.openCursor(); 
request.onsuccess = function (e) 
{ 
    var result = e.target.result; 
    if(!!result == false) { return; } 
    // Use result.value some how 

    // Comment out this line to process the first item only 
    //result.continue(); 
}; 
+0

我的确做到了这一点,而且目前工作正常,但是当您尝试关闭Chrome附加组件(我需要在附加组件中使用此附加组件)时,整个Chrome浏览器都会崩溃。 – strider 2012-01-31 17:35:44

+0

Chrome有一些使用IndexedDB会导致整个浏览器崩溃的问题。我曾向Chrome团队[提交缺陷](http://code.google.com/p/chromium/issues/detail?id=108871),我相信它现在已经修复(至少在dev版本中) 。在开发版或金丝雀版Chrome或Firefox中再次尝试您的代码,因为它似乎始终有效。 – Shawn 2012-02-02 04:37:43

1

您可以使用Transaction.abort()

例如,如果使用@肖恩的例子

var db = _IndexedDatabase; 
var trans = db.transaction(["Sites"], IDBTransaction.READ_ONLY); 
trans.onabort = function(event) { 
     console.log(event); 
}; 
var store = trans.objectStore("Sites"); 
var request = store.openCursor(); 
request.onsuccess = function (ev) 
{ 
    var cursor = request.result || ev.target.result; 
    if(!!cursor == false) 
      return; 

    console.log(cursor.value); 
    try{ 
     transaction.abort(); 
    }catch(e){ 
     console.log(e); 
    } 
}; 
6

使用游标而不是调用.continue()根本不是破解。这是预期的方式。关于游标的要点正是它们让你只能获取你需要的信息。

所以不需要调用transaction.abort()

0

只需使用该指数的Get方法。这将返回给定键的第一条记录,只有缺点是你无法排序。