IndexedDB - 布尔索引

时间:2012-12-02 19:28:48

标签: google-chrome indexing boolean indexeddb

是否可以在布尔类型字段上创建索引?

让我们说我要存储的记录的架构是:

{
  id:1,
  name:"Kris",
  _dirty:true
}

我创建了普通非唯一索引( onupgradeneeded ):

...
store.createIndex("dirty","_dirty",{ unique: false })
...

创建了索引,但它是空的! - 在索引IndexedDB浏览器中,没有布尔值的记录 - 仅字符串数字日期甚至的阵列

我正在使用Chrome 25金丝雀

我想找到_dirty属性设置为true的所有记录 - 我是否必须将_dirty修改为string或int?

3 个答案:

答案 0 :(得分:8)

是的,boolean is not a valid key

如果必须,您当然可以解决为1和0。

但这是有充分理由的。索引布尔值不提供信息。在上面的例子中,您可以动态地进行表扫描和过滤,而不是索引查询。

答案 1 :(得分:4)

标记为已选中的答案并不完全正确。

您无法在包含布尔JavaScript类型值的属性上创建索引。另一个答案的那一部分是正确的。如果您有var obj = {isActive: true};之类的对象,尝试在obj.isActive上创建索引将无效,浏览器将报告错误消息。

但是,您可以轻松模拟所需的结果。 indexedDB不会将对象中不存在的属性插入索引。因此,您可以定义一个属性来表示true,而不是定义属性来表示false。当属性存在时,对象将出现在索引中。当该属性不存在时,该对象将不会出现在索引中。

实施例

例如,假设您有一个' obj'对象。假设您要在这些对象的isActive属性上创建类似布尔值的索引。

首先在isActive属性上创建索引。在onupgradeneeded回调函数中,使用store.createIndex('isActive','isActive');

代表' true'对于一个对象,只需使用obj.isActive = 1;。然后将对象添加或放入对象库。如果要查询设置了isActive的所有对象,只需使用db.transaction('store').index('isActive').openCursor();

要表示false,只需使用delete obj.isActive;,然后将对象添加或放入对象库。

当您查询设置了isActive的所有对象时,这些缺少isActive属性的对象(因为它已删除或从未设置)在使用游标进行迭代时不会出现。

Voila,布尔索引。

演出说明

在索引上打开游标就像在此处使用的示例中所做的那样,将提供良好的性能。小数据时性能差异不明显,但在存储大量对象时非常明显。没有必要采用某些第三方库来完成“布尔索引”。这是一个平凡而简单的功能,您可以自己做。您应该尝试尽可能多地使用本机功能。

答案 2 :(得分:0)

布尔属性描述独占状态(主动/非主动),'开/关','启用/禁用','是/否'。您可以在JS数据模型中使用这些值对而不是布尔值来提高可读性。此外,这种策略允许添加其他状态(' NotSet',如果没有在对象中配置某些内容等情况)......