我正在研究支持排序,过滤,无限滚动等的数据表/网格Web组件。我正在考虑用IndexedDB替换现有的数据模型(使用Dexie)。
我的初步计划是使用单个数据库,并为每个组件设置"表" 。但是,在阅读完文档之后,我意识到每次添加新表时,数据库的版本都会上升。
这意味着什么?
感谢您的帮助
答案 0 :(得分:1)
indexedDB的架构确实是静态的。每当您必须更改它时,它将需要关闭所有现有的连接,这些连接可能会在您的应用加载时中断其他选项卡。如果您的应用程序的所有实例都行为相同 - 即关闭并在发生'versionchange'事件时动态重新打开其数据库。这是可能的。但是,长时间运行的事务会阻止它升级,直到完成为止。
我很想知道你想要完成什么。我想你想利用indexedDB索引进行排序和分页/滚动。但目前尚不清楚你是否有一个具体的模型,或者你的组件是否通用/适应任何模型/模式。
如果您的模型具体,并且您的组件特定于最终用户应用程序。您可以使用Dexie(db.version(1).stores(...))静态建模。但是当你提出这个问题时,我想你想创建一个通用组件,问题是你是否真的应该在你的组件中定义一个模式,或者让它的用户定义它并让你的组件适应现有的数据库。例如,组件的用户可能希望定义数据库并将组件用作数据查看器。您的组件可以采用输入参数:
(databaseName, tableName, columns)
然后,您可以在不指定架构的情况下实例化Dexie,而只需打开现有数据库:
var db = new Dexie(databaseName);
// Don't specify version() - open dynamically!
db.open().then(db => {
var table = db.table(tableName);
var indexedColumns = table.schema.indexes.map(idx => idx.keyPath);
if (table.schema.primKey.keyPath)
indexedColumns.unshift(table.schema.primKey.keyPath);
}
// Here you can render your columns.
// For each column that also exists in indexedColumns, you can
// orderBy() or put queries based on it.
});
相关文档: