indexDB操作

class DB {
    
    db// 数据库对象
    dbName// 数据库名
    table// 表对象
    tableName// 表名

    constructor(dbName) {
        this.dbName = dbName
    }

    // 打开indexDB
    // 打开/创建数据库
    initDB = (dbName) => {
        return new Promise((resolve,reject) => {
            const name = dbName || this.dbName
            if(!name) return reject('请指定要打开的数据库名')
            const request  = window.indexedDB.open(name)
            request.onerror = () => {
                this.dbName = undefined
                console.error(name+'数据库打开失败')
                reject(false)
            }
            request.onsuccess = (res) => {
                this.dbName = name
                this.db = res.target.result
                console.log(name+'数据库打开成功')
                resolve(true)
            }
            request.onupgradeneeded  = (res) => {
                this.db = res.target.result
                console.log(name+'数据库打开或更新成功')
                resolve(true)
            }
        })
    }

    // 初始化表
    createObjectStore = (tableName,obj,indexObj) => {
        if(!this.db) {
            console.error('请先打开(initDB)数据库')
            return
        }
        if(!tableName || typeof tableName !== 'string') return
        this.tableName = tableName
        
        if (!this.db.objectStoreNames.contains(tableName)) {
            // 建表
            this.table= this.db.createObjectStore(tableName, obj);
            if(indexObj) this.createIndex(indexObj)
        }
    }

    // 添加表字段传入表对象
    createIndex = (obj) => {
        if(!this.table) {
            console.error('请先创建(createObjectStore)仓库对象')
            return
        }
        Object.keys(obj).forEach(key => {
            this.table.createIndex(key, key, { unique: obj[key].unique });
        })
    }

    // 添加数据
    addData(params, tableName) {
        const name = tableName || this.tableName

		return new Promise((resolve, reject) => {
			const transaction = this.db.transaction(
				name,
				"readwrite"
			);
			const store = transaction.objectStore(name);

			const response = store.add(params);
			response.onsuccess = (event) => {
				resolve(event);
			};
			response.onerror = (event) => {
				reject(event);
			};
		});
	}

    // 编辑数据
    updateData(params, tableName) {
        const name = tableName || this.tableName

		return new Promise((resolve, reject) => {
			const transaction = this.db.transaction(
				name,
				"readwrite"
			);
			const store = transaction.objectStore(name);

			const response = store.put(params);
			response.onsuccess = (event) => {
				resolve(event);
			};
			response.onerror = (event) => {
				reject(event);
			};
		});
    }



    // 删除数据
    removeData(key, tableName) {
        const name = tableName || this.tableName
        const transaction = this.db.transaction(name,'readwrite')
        const store = transaction.objectStore(name)
        const response = store.delete(key)

        response.onsuccess = () => {
            console.error('数据删除成功')
        }

    }

    // 清空数据
    clearData(tableName) {
        const name = tableName || this.tableName
        const transaction = this.db.transaction(name,'readwrite')
        const store = transaction.objectStore(name)
        const response = store.clear()

        response.onsuccess = () => {
            console.error('清空数据成功')
        }
        response.onerror = () => {
            console.error('清空数据失败')
        }

    }

    // 通过主键查询数据
	getDataByKey(tableName, key) {
        const name = tableName || this.tableName
		return new Promise((resolve, reject) => {
			const transaction = this.db.transaction(name);
			const objectStore = transaction.objectStore(name);
			// 通过主键读取数据
			// const request = objectStore.get(key);
			// getAll(key)同get(key)获取指定key对应数据,如果getAll不传参或者传null即返回所有数据
			const request = objectStore.getAll(key);
			request.onsuccess = () => {
				resolve(request.result);
			};
			request.onerror = (event) => {
				reject(event);
			};
		});
	}

    // 关闭数据库
    closeDB() {
        this.db.close()
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值