好的,首先,对不起我的英语。
我正在开展一个Web项目,该项目显示我在输入框中输入内容时的建议,但我想使用IndexedDB来提高Firefox中的查询速度。
使用WebSQL我有这句话:
db.transaction(function (tx) {
var SQL = 'SELECT "column1",
"column2"
FROM "table"
WHERE "column1" LIKE ?
ORDER BY "sortcolumn" DESC
LIMIT 6';
tx.executeSql(SQL, [searchTerm + '%'], function(tx, rs) {
// Process code here
});
});
我想用IndexedDB做同样的事情,我有这个代码:
db.transaction(['table'], 'readonly')
.objectStore('table')
.index('sortcolumn')
.openCursor(null, 'prev')
.onsuccess = function (e) {
e || (e = event);
var cursor = e.target.result;
if (cursor) {
if (cursor.value.column1.substr(0, searchTerm.length) == searchTerm) {
// Process code here
} else {
cursor.continue();
}
}
};
但是速度太快而且我的代码有问题......我想知道有没有更好的方法来做到这一点。
感谢回复。
答案 0 :(得分:21)
我终于找到了解决这个问题的方法。
解决方案包括在搜索词和搜索词之间绑定一个键范围,在最后一个带有'z'字母。例如:
db.transaction(['table'], 'readonly')
.objectStore('table')
.openCursor(
IDBKeyRange.bound(searchTerm, searchTerm + '\uffff'), // The important part, thank Velmont to point out
'prev')
.onsuccess = function (e) {
e || (e = event);
var cursor = e.target.result;
if (cursor) {
// console.log(cursor.value.column1 + ' = ' + cursor.value.column2);
cursor.continue();
}
};
因为我需要对结果进行排序,所以我在事务之前定义了一个数组,然后在加载所有数据时调用它,如下所示:
var result = [];
db.transaction(['table'], 'readonly')
.objectStore('table')
.openCursor(
IDBKeyRange.bound(searchTerm, searchTerm + '\uffff'), // The important part, thank Velmont to point out
'prev')
.onsuccess = function (e) {
e || (e = event);
var cursor = e.target.result;
if (cursor) {
result.push([cursor.value.column1, cursor.value.sortcolumn]);
cursor.continue();
} else {
if (result.length) {
result.sort(function (a, b) {
return a[1] - b[2];
});
}
// Process code here
}
};
答案 1 :(得分:3)
我一直在尝试使用IndexedDB,我发现它非常慢,加上api的复杂性,我不确定它是否值得使用。
这实际上取决于您拥有多少数据,但可能值得在内存中进行搜索,然后您可以将数据从某种存储中编组和取消编组,无论是indexedDB还是更简单的存储localStorage的。
答案 2 :(得分:1)
我在同样的问题上失去了约2个小时,我发现了真正的问题。
这里是解决方案:
IDBCursor.PREV
替换为prev
(这很糟糕,但这是解决方案) IDBCursor.PREV
目前在Chrome上被窃听(2013年2月26日)