IndexedDB版本控制

208 阅读2分钟

版本升级

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),你可能需要删除并重新创建对象存储  
    // 注意:重新创建对象存储时,需要迁移旧数据到新对象存储中  
}