我有这个代码(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。
发布于 2017-07-15 06:02:09
是。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-13 06:09:32
根据您的数据变体,我可能会建议使用单个表“限制”,并将限制类型作为属性(让我们称之为“类型”)。
如果您想要高效的索引,请使用type+idx的复合索引,而不只是idx。
然后,您的查询可能如下所示:
db.restrictions.where('[type+idx]`).equals (['country', n])您需要将复合索引视为一个两项数组。例如,如果您有一个age属性,您想要索引和搜索类型为== 'person‘且age > 25的项目,请执行以下操作:
db restrictions.where('[type+age]`).between (
['person', 25],
['person', Infinity]) 不过,不区分大小写的搜索是不可能的。
IndexedDB不是为动态添加表而设计的。这是可能的,但您需要以某种方式管理您的数据库的版本号,并记住,每次您需要添加新表时,使用同一数据库的其他选项卡将阻止您的模式更新请求,或者必须关闭并停止按预期运行。
https://stackoverflow.com/questions/45064466
复制相似问题