从变量传递Dexie集合

时间:2017-07-12 17:48:42

标签: dexie

我有这段代码(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查询放在一个循环中,我不能简单地一个接一个地写它们......

一些建议?

提前致谢, H.D。

2 个答案:

答案 0 :(得分:1)

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

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

您的查询可能类似于:

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

您需要将复合索引视为两项数组。例如,如果您有年龄属性,则需要索引并搜索type =='person'和age>的项目。 25,做:

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

但是不能进行不区分大小写的搜索。

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

答案 1 :(得分: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({
  ...
});