IndexedDB 创建数据库和对象存储空间需通过 indexedDB.open() 打开(或新建)数据库,并在 onupgradeneeded 事件中定义对象存储空间;该事件是唯一可创建/修改对象存储空间的地方,须指定 keyPath 或 autoIncrement,并可用 createIndex 添加索引;版本升级时提高版本号即可触发 onupgradeneeded,旧数据保留。

IndexedDB 创建数据库和对象存储空间,核心是通过 indexedDB.open() 打开(或新建)数据库,然后在 onupgradeneeded 事件中定义对象存储空间(Object Store)。
打开并创建数据库
调用 indexedDB.open() 时传入数据库名和版本号。如果数据库不存在,或版本号高于当前版本,就会触发 onupgradeneeded 事件——这是唯一能创建/修改对象存储空间的地方。
示例:
const request = indexedDB.open('myAppDB', 1);<br>
request.onerror = () => console.error('打开数据库失败');<br>
request.onsuccess = (event) => {<br>
const db = event.target.result;<br>
console.log('数据库已就绪');<br>
};
在 onupgradeneeded 中创建对象存储空间
对象存储空间相当于关系型数据库中的“表”,必须在升级事务中显式创建。不能在 onsuccess 或普通事务里新建。
立即学习“Java免费学习笔记(深入)”;
- 使用
event.target.result.createObjectStore(name, options) -
keyPath指定主键字段(如'id'),数据必须包含该字段 -
autoIncrement: true可让主键自增(此时无需提供 id) - 可同时用
createIndex()添加索引,方便按其他字段查询
完整升级示例:
request.onupgradeneeded = (event) => {<br>
const db = event.target.result;<br>
// 创建名为 'users' 的对象存储空间,主键为 'id'<br>
if (!db.objectStoreNames.contains('users')) {<br>
const store = db.createObjectStore('users', { keyPath: 'id' });<br>
// 添加姓名索引,支持按 name 查询<br>
store.createIndex('byName', 'name', { unique: false });<br>
}<br>
};
注意版本升级逻辑
后续想新增表或修改结构,只需调高 open() 的版本号,再次触发 onupgradeneeded。
- 旧版本数据库会自动升级,已有数据保留
- 可在事件中检查
event.oldVersion做兼容性处理 - 避免在升级中执行耗时操作,否则可能阻塞页面
常见错误提醒
容易出错的点:
- 直接在
onsuccess里调用createObjectStore()→ 报错:不允许在只读事务中修改结构 - 重复创建同名对象存储空间 → 抛异常,建议先用
objectStoreNames.contains()判断 - 写入数据时主键缺失或类型不符 → add() 或 put() 失败,需监听事务的
onerror


















