7

有没有办法在 IndexedDB 中只获得第一行?我找不到任何东西。

4

5 回答 5

9

使用游标而不调用 .continue() 根本不是 hack。这是预期的方式。游标的一个要点正是它们让您只获取您需要的信息。

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

于 2012-06-15T22:28:11.830 回答
2

有点骇人听闻,但我相信如果您不对结果对象调用 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();
};
于 2012-01-28T00:49:31.140 回答
1

您可以使用 Transaction.abort()

例如,如果使用@Shawn 的示例

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);
    }
}; 
于 2012-03-09T06:12:10.143 回答
0

由于我找不到任何东西,所以这就是我现在已经实施的,它对我的​​目的很有用。这是一个 hack,我对此不满意,但是,嘿,现在,这会做。

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

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

于 2012-03-09T20:45:27.703 回答
0

只需在索引上使用 Get 方法。这将返回给定键的第一条记录,唯一的缺点是您无法排序。

于 2012-08-16T07:09:07.490 回答