5

有人可以告诉我是否可以使用索引、openCursor 和 keyRange 对 indexeddb 对象存储执行不区分大小写的搜索...。
我可以区分大小写并设法使用 toUpperCase 函数实现某些东西,但是有很多不同的这是不可行的...
欢迎任何帮助...谢谢...尝试示例:

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...是大写的...到目前为止,这不是一个理想的解决方案,但是它可以工作并且可以快速满足我的需求...也许我们最终会得到不区分大小写的搜索,也许不会...

4

3 回答 3

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
};

然后继续使用您的代码。

于 2012-03-15T15:42:29.303 回答
4

Dexie.js在不附加索引的情况下不区分大小写的搜索做得很好。

于 2014-03-27T13:47:48.383 回答
1

您看到所见的原因是 IndexedDB 游标是按字典顺序排序的。

在这种范式下,a > A 不像字母排序,它听起来更像您正在寻找的内容。

要实现字母排序,您必须在字典排序中的所有记录中进行光标(直到您event.target.result在您onsuccess的全球共享。

于 2012-03-20T22:40:26.737 回答