2012-06-11 48 views
1

我找不出这段代码有什么问题。我有一个indexedDB实例。 keyPath是自动生成的。我可以成功地将对象添加到数据库并获取数据库中的所有对象,但是我无法在我创建的索引中成功搜索对象。IndexedDB - 搜索索引event.target.result始终为空

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

+0

我更新了代码以确认索引“lname”已成功创建:http://jsfiddle.net/R5ngM/16/ –

+0

感谢您收录了小提琴。我会看看 – buley

+0

现在应该解决这个问题 – buley

回答

2

还没钉它完美但但问题似乎是,你打开光标放在你的对象存储,而不是指数。使用默认的keyPath可以正常工作,但在尝试使用辅助索引时不起作用。

我想什么你希望做的应该是这样的:

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

UPDATE:我花了很多时间与指标光标发现上述问题后,找错了地方。这是问题:你正在存储的对象是一个数组而不是对象文字。

我一直在寻找到你存储对象,并注意到了这一点:

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

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

Here's a largely-similar chunk of working code。在调试的时候我把它弄糟了,但你会得到这个要点。 (这是一个很好的snippit,所以如果你不介意,我会用它作为其他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()}; 
+0

我在索引上打开了一个游标,试图查看内容,但它是空的。 http://jsfiddle.net/R5ngM/17/我希望jsfiddle有行号。我想我只是有一个空索引... –

+1

我的尝试都没有返回一个'IDBCursorWithValue'对象,但他们都返回'onsuccess'和没有'onerror's的东西。我倾向于同样的结论,但问题是为什么? – buley

+0

我刚刚尝试了FF的最新版本,以查看我的大型主机修补程序是否损坏,并且FF似乎无法识别我尝试初始化indexedDB的任何尝试,尽管我使用的是mozilla文档中的示例。这是跛脚。 –

0

还必须指出的是,上面的问题,甚至可能会出现当您打开索引上的光标。如果您在索引上打开游标,但仍然始终为空,则应该再次检查您创建索引的数据类型以及要创建索引游标的数据类型。在我的情况下,我创建了字符串数据类型的索引,并用int打开索引上的游标,这让我疯狂。