有人可以告诉我是否可以使用index,openCursor和keyRange ....对indexeddb对象存储区执行不区分大小写的搜索。
我可以做区分大小写并设法使用toUpperCase函数实现一些东西,但是有很多不同的变量,它是不可行的相关...
任何帮助欢迎... Thanx ...
尝试示例:
var transaction = db.transaction("products", IDBTransaction.READ_ONLY);
var store = transaction.objectStore("products");
var descIndex = store.index('Index1');
var boundKeyRangeUpper = IDBKeyRange.bound(request.term.toUpperCase(), (request.term.toUpperCase()+'Z'));
descIndex.openCursor(boundKeyRangeUpper).onsuccess = function (e)
更新
这是我最终实现的:
覆盖的四个范围和可能性,即FA,fA,Fa,fa ......这只在第一个字母上完成,即'F'
var boundKeyRangeUpper = IDBKeyRange.bound(term.toUpperCase(), term.toUpperCase()+'Z');
var boundKeyRangeUpper2 = IDBKeyRange.bound(term.toUpperCase(), term.toUpperCase()+'z');
var boundKeyRangeLower = IDBKeyRange.bound(term.toLowerCase(), term.toLowerCase()+'z');
var boundKeyRangeLower2 = IDBKeyRange.bound(term.toLowerCase(), term.toLowerCase()+'Z');
上面的搜索结果存储在另一个objectStore中,但其描述为大写,因此FISH,FRUIT,FRESH SALAD ...现在如果在F之后按下一个字母,例如'r'搜索将调查这个新的对象商店,其中一切都是大写的...这不是一个理想的解决方案,但它的工作原理很快就满足了我的需求......也许我们最终会得到不区分大小写的搜索,也许不...
答案 0 :(得分:6)
我建议修改对象存储的结构,这是通过向键大小添加一个列(即属性到商店中的每个对象),然后将该新属性作为键而不是
//object
var lang = {
name: 'Javascript',
keyName: '', //THE NEW PROPERTY - KEY OF THE OBJECTSTORE
interest: 100
};
当您向商店添加对象时,使用名称(或术语或其他)的大写修改新属性,以便对象为:
//object
var lang = {
name: 'Javascript',
keyName: 'JAVASCRIPT', // NEW PROPERTY MODIFIED TO UPPERCASE OF OLD KEY
interest: 100
};
然后继续使用您的代码。
答案 1 :(得分:4)
Dexie.js在没有附加索引的情况下不区分大小写的搜索方面做得很好。
答案 2 :(得分:1)
您看到的内容是IndexedDB游标是lexicographically sorted。
在这种范例下,> A,与alphabetical sorting不同,听起来更像你正在寻找的东西。
要实现按字母顺序排序,您必须浏览词典排序中的所有记录(直到event.target.result
中的onsuccess
为空),然后将结果添加到共享全局,然后,完成字典排序后,返回按字母顺序排列的共享全局。