Angular2中用Dexie扩展mdValuta表字段遇ConstraintError问题
解决Dexie升级表结构时的ConstraintError问题
这个报错的核心原因是你在Dexie版本升级时,重复声明了已经存在的索引/字段,导致Dexie尝试创建已存在的对象存储索引,触发了浏览器IndexedDB的约束限制。
为什么会出错?
Dexie的版本升级逻辑是:每个新版本的stores()方法只需要声明相对于上一版本的变化,不需要重复写出所有已有的字段。你在version(3)里把mdValuta的所有字段都列了出来,这会让Dexie误以为你要重新创建这些已经存在的索引(比如codudm、numdec等),而这些索引在版本2中已经存在,所以浏览器抛出了ConstraintError。
正确的升级写法
只需要在新版本的stores()里指定新增的字段f3和f4即可,已有的字段不需要重复声明:
super('WEB_IndexedDB'); // 版本1:初始表结构 this.version(1).stores({ mdValuta:'codudm,numdec,numdecpre' }); // 版本2:新增f1、f2字段 this.version(2).stores({ mdValuta:'+f1,+f2' }); // 版本3:新增f3、f4字段 this.version(3).stores({ mdValuta:'+f3,+f4' });
这里的+前缀表示新增的索引字段,如果你的f3、f4不需要作为索引,甚至可以省略+直接写字段名(不过推荐加上+明确表示新增意图)。
额外修复步骤
如果你已经尝试过错误的升级,导致浏览器的IndexedDB里残留了错误的版本记录,可能需要先清除该应用的IndexedDB数据:
- 打开浏览器开发者工具(F12)
- 找到
Application标签(Chrome)或Storage标签(Firefox) - 在左侧找到
IndexedDB,选中WEB_IndexedDB右键删除 - 刷新页面重新测试
这样就能保证Dexie从干净的状态开始执行版本升级逻辑。
内容的提问来源于stack exchange,提问作者DarioN1
相关产品推荐
相关产品推荐

