IndexedDB - 搜索索引event.target.result始终为null

时间:2012-06-11 17:59:32

标签: html5 indexeddb

我无法弄清楚这段代码有什么问题。我有一个indexedDB实例。 keyPath是自动生成的。我可以成功地将对象添加到数据库并获取数据库中的所有对象,但我无法在我创建的索引中成功搜索对象。

请参阅我的jsfiddle:http://jsfiddle.net/R5ngM/13/

2 个答案:

答案 0 :(得分:2)

尚未完美地钉它但问题似乎是你在对象存储上打开光标而不是索引。使用默认的keyPath可以正常工作,但是当你尝试使用二级索引时它将不起作用。

我认为您的目标应该是:

    var request = null;
    if ( null === index || 'undefined' === typeof index ) {
        request = transaction.openCursor( keyRange );
    } else {
        request = index.openCursor( keyRange );
    }
    request.onsuccess = on_success;

更新:在找到索引光标的上述问题后,我花了很多时间查找错误的地方。这是问题所在:您存储的对象是一个数组而不是对象文字。

我正在查看您存储的对象并注意到这一点:

        var entry = '<li>'+row[0].fname+' '+row[0].lname+'</li>';

了解您如何访问row数组的第一个元素?你正在存储一个数组。您的keypath(和我)假设存储了一个对象。我相信可以在阵列上设置索引,但无论如何你的keyPath都已关闭。

Here's a largely-similar chunk of working code。调试时我把它搞砸了,但你会得到一个要点。 (这是一个很好的狙击手,所以如果你不介意的话,我稍后会用它作为其他StackOverflow例子的基础。)

将光标保持在索引上,如上面的答案中所述。然后改为这一行:

var entry = '<li>'+row[0].fname+' '+row[0].lname+'</li>';

改变了这个:

var newUser = [{fname:$('#fname').val(),lname:$('#lname').val()}];

对此:

var newUser = {fname:$('#fname').val(),lname:$('#lname').val()};

答案 1 :(得分:0)

还必须注意,当您在索引上打开游标时,甚至会出现上述问题。如果在索引上打开游标并且仍然始终为null,则应仔细检查创建索引的数据类型以及要在其上创建索引游标的数据类型。在我的情况下,我创建了字符串数据类型的索引,并使用int打开索引上的光标,这让我发疯。