版本升级
indexedDB有版本的概念,所以我们在升级时需要显性传入版本号,并且监听upgradeneeded事件来进行更新代码。而因为indexedDB的表格并没有要求表格字段,可以随意添加。所以我们对表结构的升级主要是一些索引的建立等
所以我们可以得出一开始的两个步骤
1. 显性传入版本号
let openRequest = indexedDB.open("数据库名称", 新版本号);
2. 监听更新事件
openRequest.onupgradeneeded = function(event) {
};
3. 更新表结构
此时有两种情况,一种是新建表,一种是修改表索引。
// 新建表
openRequest.onupgradeneeded = function(event) {
let db = event.target.result; // 获取数据库对象
let oldVersion = event.oldVersion; // 获取旧版本号
let newVersion = event.newVersion; // 获取新版本号
// 在这里进行数据库结构的升级操作
// 例如,创建新的对象存储(ObjectStore)或索引(Index)
if (!db.objectStoreNames.contains('新的ObjectStore名称')) {
db.createObjectStore('新的ObjectStore名称', {keyPath: '主键字段', autoIncrement: true});
// 如果需要,可以创建索引
db.transaction(['新的ObjectStore名称'], 'readwrite').objectStore('新的ObjectStore名称').createIndex('索引名称', '索引字段', {unique: false});
}
// 如果需要,还可以根据旧版本号来执行特定的升级逻辑
// 例如,如果从版本1升级到版本2,执行某些操作
// if (oldVersion === 1) {
// // 执行版本1到版本2的升级逻辑
// }
};
// 修改本地表索引
if (db.objectStoreNames.contains('你的对象存储名称')) {
let objectStore = db.transaction(['你的对象存储名称'], 'readwrite').objectStore('你的对象存储名称');
// 如果需要添加新的索引
if (!objectStore.indexNames.contains('新的索引名称')) {
objectStore.createIndex('新的索引名称', '索引字段', {unique: false});
}
// 如果需要删除索引(注意:IndexedDB API 并没有直接删除索引的方法,通常的做法是重新创建对象存储而不创建该索引)
// 或者,如果需要修改对象存储的其他属性(如 keyPath),你可能需要删除并重新创建对象存储
// 注意:重新创建对象存储时,需要迁移旧数据到新对象存储中
}