vue + indexDB 使用记录

项目是vue项目,且需要在无网的环境中运行,因此需要数据存储在自己本地,等有网的时候进行同步
好记性不如烂笔头,仅作记录,如果有疑问欢迎留言,看到会回复的,只是一些个人理解,请勿上升高度。
indexDB api 地址

使用步骤

1、创建数据库
2、创建表

在创建数据库之前引入indexDb文件,其中记录了创建数据库到增删改到删除的那个一系列方法

export default {
    // indexedDB兼容
    indexedDB: window.indexedDB || window.webkitindexedDB || window.msIndexedDB || window.mozIndexedDB,
    /**
     * 打开数据库
     * 新对象储存空间newStore参数:newStore.name、newStore.key
     * 新增对象存储空间要更改数据库版本
     * @param {数据库名称} dbname 
     * @param {版本} version 
     * @param {数据库} db 
     * @param {配置} newStore 
     * @param {回调函数} callback 
     */
    openDB(dbname, version, callback) {
    	let db
        version = version || 1;
        const request = this.indexedDB.open(dbname, version);
        request.onerror = function () {
            console.log('IndexedDB数据库打开错误');
        };
        request.onsuccess = function (event) {
            db = event.target.result;
            if (callback && (typeof callback === 'function')) {
                callback(db);
            }
        };
        // onupgradeneeded,调用创建新的储存空间(只有在数据库未被创建和数据库版本更改的时候才会触发)
        request.onupgradeneeded = function (event) {
            db = event.target.result;
            if (!db.objectStoreNames.contains('tableView')) {
                const objectStore1 = db.createObjectStore('tableView',{keyPath:'clientId'});
                let datas = ["clientId","tradeNo"]
                datas.forEach(item => {
                    objectStore1.createIndex(item + '_index', item, {
                        unique: false
                    });
                })
            }
        };
    },
    /**
     * 删除数据库
     * @param {*} dbname 
     * @param {*} callback 
     */
    deleteDb(dbname, callback) {
        const deleteQuest = this.indexedDB.deleteDatabase(dbname);
        deleteQuest.onerror = function () {
            console.log('删除数据库出错');
        };
        deleteQuest.onsuccess = function () {
            if (callback && (typeof callback === 'function')) {
                callback();
            }
        }
    },
    /**
     * 关闭数据库
     * @param {*} dbname 
     */
    closeDB(dbname) {
        dbname.close();
        console.log('数据库已关闭');
    },
    /**
     * 删除数据
     * @param {*} db 
     * @param {*} storename 
     * @param {*} key 
     * @param {*} callback 
     */
    deleteData(db, storename, key, callback) {
        const store = db.transaction(storename, 'readwrite').objectStore(storename);
        const request = store.delete(key);
        request.onsuccess = function () {
            if (callback && (typeof callback === 'function')) {
                callback('删除成功');
            }
        }
        request.onerror = function () {
            if (callback && (typeof callback === 'function')) {
                callback('删除失败');
            }
        }

    },
    /**
     * 清空数据
     * @param {*} db 
     * @param {*} storename 
     * @param {*} callback 
     */
    clearData(db, storename, callback) {
        const store = db.transaction(storename, 'readwrite').objectStore(storename);
        const request = store.clear();
        request.onsuccess = function () {
            if (callback && (typeof callback === 'function')) {
                callback('清空数据成功');
            }
        }
        request.onerror = function () {
            if (callback && (typeof callback === 'function')) {
                callback('清空数据失败');
            }
        }
    },
    /**
     * 添加数据
     * @param {*} db 
     * @param {*} storename 
     * @param {*} obj 
     */
    addData(db, storename, list) {
        const store = db.transaction(storename, 'readwrite').objectStore(storename);
        list.forEach(ls => {
            const request = store.add(ls);
            request.onsuccess = function () {
                console.log('数据写入成功');
            };
            request.onerror = function () {
                console.log('数据写入失败');
            }
        })
    },
    /**
     * 更新数据
     * @param {*} db 
     * @param {*} storename 
     * @param {*} obj 
     */
    updateData(db, storename, list,callback) {
        const store = db.transaction(storename, 'readwrite').objectStore(storename);
        list.forEach(ls => {
            const request = store.put(ls);
            request.onsuccess = function () {
                if (callback && (typeof callback === 'function')) {
                    callback(true);
                }
                console.log('数据更新成功');
            };
            request.onerror = function () {
                if (callback && (typeof callback === 'function')) {
                    callback(false);
                }
                console.log('数据更新失败');
            }
        })
    },
    /**
     * 根据主键获取数据(数据库的下标)
     * @param {*} db 
     * @param {*} storeName 
     * @param {*} key 
     * @returns 
     */
    getData(db, storeName, key){
        var objectStore = db.transaction(storeName).objectStore(storeName);
        var request = objectStore.get(key);
        request.onerror = function(event) {
            console.log('事务失败');
        };
        return new Promise((resolve, reject) => {
            request.onsuccess = function (e) {
                resolve(e.target.result)
            }
        })
    },
    /**
     * 根据索引获取数据
     * @param {*} db 
     * @param {*} storeName 
     * @param {*} field 
     * @param {*} val 
     */
    getDataByIndex(db, storeName, field, val) {
        const objectStore = db.transaction(storeName).objectStore(storeName);
        const indexs = objectStore.index(field + '_index');
        const request = indexs.get(val);
        return new Promise((resolve, reject) => {
            request.onsuccess = function (e) {
                resolve(e.target.result)
            }
        })
    },
    /**
     * 获取全部数据
     * @param {*} db 
     * @param {*} storeName 
     * @returns 
     */
    getAllData(db, storeName) {
        const objectStore = db.transaction(storeName).objectStore(storeName);
        const request = objectStore.openCursor();

        let data = [];
        return new Promise((resolve, reject) => {
            request.onsuccess = function (e) {
                var cursor = e.target.result;
                if (cursor) {
                    data.push(cursor.value);
                    cursor.continue();
                } else {
                    resolve(data)
                }
            }
        })
    },
    /**
     * 遍历全部数据,判断数据是否已存在于数据库
     * @param {*} allDbData
     * @param {*} list
     * @returns 
     */
     readAllData(allDbData, list){
        let flagIndex
        allDbData.then(res => { 
            flagIndex = res.findIndex(val=>{
                return (val.menuid == list[0].menuid)
            })
        })
        return flagIndex
     },
    //  查询数据方法
     getDatabyId(db, storeName,filId,val){
        const objectStore = db.transaction(storeName).objectStore(storeName);
        const indexs = objectStore.index(filId + '_index');
        const request = indexs.openCursor(IDBKeyRange.only(val));//精确查询,查询内容相等的数据
        // const startTime = new Date("2024-03-21T00:00:00Z").toISOString();
        // const endTime = new Date("2024-03-26T00:00:00Z").toISOString();
        // const range = IDBKeyRange.bound(this.utcDate(val), this.utcDate(vals) );//后两位参数,true代表不包含val 反之包含 >= val 和 > val的区别
        // const request = indexs.openCursor(range);
        let data = [];
        return new Promise((resolve, reject) => {
            request.onsuccess = function (event) {
                const cursor = event.target.result;
                if (cursor) {
                    data.push(cursor.value)
                    cursor.continue(); // 继续查找其他记录
                }else{
                    resolve(data)
                }
                
            }
        })
     },
     utcDate(val){
        const date = new Date(val);
        let utcDates = new Date(date.getTime() + date.getTimezoneOffset() * 60000);
        console.log(new Date(utcDates).toISOString())
      return new Date(utcDates).toISOString()
     },
}

1、创建数据库

main.js中打开数据库,如果没有改数据库会自动创建,其中如果版本发生变动,出触发数据库中表的重新创建

//参数分别为数据库名称,数据库版本,返回的方法
indexDb.openDB('databaseName', 1, function(db){
  Vue.prototype.$tableDb = db //全局保存数据库
})
2、创建表

表的创建可以在打开数据库的时候通过参数的方式进行,也可以直接写在indexDb中,数据库的表在会在第一次创建库和数据库的版本(在2024-4-26测试版本的时候发现版本号不支持小数,比如1.1,仅支持整数)更改时进行创建和更新
onupgradeneeded用来创建表,触发条件就是上述的两种

//materView是表名,{autoIncrement: true}表示主键自增长,也可以固定主键名
const objectStore1 = db.createObjectStore('materView',{keyPath:'clientId'});//固定主键名称,但不会自增长
const objectStore2 = db.createObjectStore('materView',{autoIncrement: true});
let data = ['id']//表中的字段名称,如果需要根据字段进行查询数据,在这里必须添加,否则可以不加
datas.forEach(item => {
  objectStore1.createIndex(item, item, {
       unique: false//表示该字段是否自增,false为不自增,true为自增
   });
})

增删改等操作在indexDb中都有记录,可以自行查阅,不进行记录了
返回数据排序,根据lineNo 字段进行降序 res.sort((a, b) => b.lineNo - a.lineNo);

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值