我有这段代码(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。
答案 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({
...
});