能否在IndexedDB版本更新时为已有objectStore新增索引?
当然可以!这是IndexedDB支持的常规操作之一
当你需要给已存在的objectStore追加新索引时,核心步骤就是提升数据库的版本号,然后在onupgradeneeded事件里针对已有的objectStore添加新索引就行。
关键要点:
- 每次修改数据库结构(不管是加索引、改objectStore属性还是新增存储对象),都得把打开数据库时的版本号设得比当前现存的版本高
- 要注意:如果硬创建一个已经存在的索引,
createIndex()会直接抛出错误,所以建议先检查目标索引是否存在,避免不必要的报错
代码示例
先回顾下你给出的基础配置(对应数据库版本1):
db.onupgradeneeded = function(event) { var db = event.target.result; var store = db.createObjectStore('name', { keyPath: 'id' }); store.createIndex('by name', 'name', { unique: false }); };
假设现在要给这个name objectStore加一个按email字段查询的索引,我们只需要把数据库版本升到2,然后在升级事件里处理:
// 打开数据库时指定新版本号2 var request = indexedDB.open('your-database-name', 2); request.onupgradeneeded = function(event) { var db = event.target.result; // 获取已经存在的objectStore var store = event.target.transaction.objectStore('name'); // 先检查索引是否存在,不存在再创建 if (!store.index('by email')) { // 这里根据需求设置unique参数,比如email是唯一的就设为true store.createIndex('by email', 'email', { unique: true }); } };
额外说明
onupgradeneeded事件只会在用户打开的数据库版本号比本地已保存的版本高时触发,所以这个修改过程是安全的——只有首次打开更新后的应用时才会执行结构变更,不会破坏已有的数据。
内容的提问来源于stack exchange,提问作者volna
相关产品推荐
相关产品推荐

