0

我有这个代码(Indexeddb/Dexie)

db1.RestrictionsImport.where('idx').equals(n).toArray().then(function(x){...})

这很好用,但我有许多带有“限制”的集合,我必须对其执行搜索。如果我这样做:

var collection= ['RestrictionsImport','RestrictionsPrice','RestrictionsCountry','RestrictionsPart',...etc]
db1.collection[0].where('idx').equals(n).toArray().then(function(x){...})

它崩溃了:

index.html:251 Uncaught TypeError: Cannot read property 'where' of undefined at index.html:251   (anonymous) @ index.html:251

这一系列限制类型可以根据其他查询从几个到几十个,所以我必须将 Dexie 查询放在一个循环中,我不能简单地一个接一个地编写它们......

一些建议?

先谢谢了,高清

4

2 回答 2

1

根据您的数据变化,我可能会建议使用单个表“限制”并将限制类型作为属性(我们称之为“类型”)。

如果您想要有效的索引,请使用 [type+idx] 的复合索引,而不仅仅是 idx。

您的查询可能类似于:

db.restrictions.where('[type+idx]`).equals (['country', n])

您需要将复合索引视为一个包含两项的数组。例如,如果您有一个 age 属性,您想索引并搜索 type == 'person' 和 age > 25 的项目,请执行以下操作:

db restrictions.where('[type+age]`).between (
    ['person', 25],
    ['person', Infinity]) 

但是,不区分大小写的搜索是不可能的。

IndexedDB 不是为动态添加表而设计的。虽然这是可能的,但您需要以某种方式管理数据库的版本号,并记住,每次您需要添加新表时,针对同一数据库工作的其他选项卡将阻止您的架构更新请求,或者关闭并停止按预期运行。

于 2017-07-12T22:09:32.023 回答
1

是的。db.tables是要访问的属性,以获取已定义表的数组:

db.tables.forEach(table => {
    console.log(table.name);
});

表是Dexie.Table的一个实例

例如,如果您需要在每个表中添加一个新项目,请执行以下操作:

Promise.all(db.tables.map(table => table.put(newItem)))
  .then(...)
  .catch(...)

上面的代码也可以在事务中使用:

db.transaction('rw', db.tables, () => {
  return Dexie.Promise.all(db.tables.map(table => {
    return table.put(newItem);
  }));
}).then({
  ...
}).catch({
  ...
});
于 2017-07-14T22:02:09.290 回答