2

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

见我的 jsfiddle:http: //jsfiddle.net/R5ngM/13/

4

2 回答 2

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都关闭了。

这是一个大体相似的工作代码块。我在调试时把它搞砸了,但你会明白要点的。(这是一个很好的片段,所以如果你不介意,我稍后会用它作为其他 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()};
于 2012-06-11T23:39:45.140 回答
0

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

于 2015-02-10T11:27:50.450 回答