indexeddb中object store是数据库的基本数据容器,类似关系型数据库的“表”,必须在upgradeneeded事件中创建,命名需合法且语义明确,支持keypath或autoincrement主键配置,不支持直接重命名或修改结构。

在HTML5的IndexedDB中,并没有名为 ObjectStore 的独立“对象”,而是将 object store(对象仓库) 视为数据库中的基本数据容器。它类似于关系型数据库中的“表”,用于存储结构化数据,但不支持SQL查询,也不具备传统意义上的“对象实例”。创建和命名 object store 是使用 IndexedDB 的关键第一步,直接影响后续数据操作的可维护性与兼容性。
创建 object store 的时机与前提
object store 必须在数据库版本升级时(即在 upgradeneeded 事件处理函数中)创建,不能在数据库已打开后动态新增(除非再次调用 open() 并指定更高版本号触发升级)。未在升级阶段创建的 object store,在后续事务中将不可用。
- 仅当传入的版本号高于当前数据库版本时,
indexedDB.open(dbName, newVersion)才会触发upgradeneeded - 在该事件回调中,通过
event.target.result.createObjectStore(name, options)创建 - 若重复创建同名 object store(且版本未变),会抛出
InvalidStateError
命名规则与实用建议
object store 名称是字符串,由开发者定义,但需遵守以下事实约束和工程实践:
- 名称区分大小写,
"users"和"Users"是两个不同仓库 - 不能包含控制字符、斜杠(
/)、反斜杠(\)、空字符等非法字符;建议只用 ASCII 字母、数字、下划线(_)和短横线(-) - 避免使用 JavaScript 保留字(如
class、default、function),虽不报错,但可能引发混淆或工具链问题 - 推荐采用小写+下划线风格(如
user_profile、app_settings),与多数前端命名习惯一致 - 名称应体现业务语义,避免泛化(如不用
data、store1),便于协作与调试
常见配置选项说明
创建时可传入 options 对象,最常用的是 keyPath 和 autoIncrement:
-
keyPath: 'id'表示使用对象的id字段作为主键(内键),存入数据时该字段必须存在且唯一 -
autoIncrement: true表示启用自增主键(外键),此时无需提供 key,系统自动生成递增数字键;常与无keyPath配合使用 - 二者不可同时为真:若设了
keyPath,则autoIncrement无效;若启用autoIncrement,就不能设keyPath - 也可省略
options,此时需在添加数据时显式传入 key(即使用add(value, key))
删除与重命名的现实限制
IndexedDB 不支持直接重命名或修改已有 object store 的结构。如需调整:
- 只能通过升级数据库版本,在新版本中创建新名称的 object store
- 手动迁移旧数据(读出 → 转换 → 写入新 store)
- 再调用
deleteObjectStore(oldName)删除旧仓库(同样只能在upgradeneeded中执行) - 注意:删除后无法恢复,且所有索引、数据一并清除
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











