我无法弄清楚这段代码有什么问题。我有一个 indexedDB 实例。keyPath 是自动生成的。我可以成功地将对象添加到数据库并获取数据库中的所有对象,但是我无法在我创建的索引中成功搜索对象。
见我的 jsfiddle:http: //jsfiddle.net/R5ngM/13/
我无法弄清楚这段代码有什么问题。我有一个 indexedDB 实例。keyPath 是自动生成的。我可以成功地将对象添加到数据库并获取数据库中的所有对象,但是我无法在我创建的索引中成功搜索对象。
见我的 jsfiddle:http: //jsfiddle.net/R5ngM/13/
还没有完美地解决它,但问题似乎是您在对象存储上打开光标,而不是在索引上。使用默认的 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()};
还必须注意,当您在索引上打开游标时,甚至会出现上述问题。如果您在索引上打开游标,但仍然始终为 null,则应仔细检查创建索引的数据类型以及创建索引游标的数据类型。就我而言,我在字符串数据类型上创建了索引,并用 int 在索引上打开了一个游标,这让我发疯了。