添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

indexDB使用及理解

兼容性

上面的网站是检测兼容性的,截止到写文章为止,如图,兼容性最主要的是需要注意ios的safari浏览器14版本的不兼容问题: 该错误导致indexedDB在最初打开浏览器时从不加载。

1.打开数据库

window.indexedDB.open(parm.dbName, parm.versions)
// parm.dbName 数据库名称
// parm.versions 数据库版本号 

2.创建库表

// 数据库版本更新时会调用此回调函数,在最初创建数据库时会默认调用一次 
 request.onupgradeneeded = event => {
                this.db = event.target.result;
               if (!this.db.objectStoreNames.contains(parm.objName)) {
                   // 创建表单,设置id为主键,id可以自定义
                   this.db.createObjectStore(parm.objName, {
                    keyPath: "id"
    };


3.新增

     let transaction = this.db.transaction([parm.objName], "readwrite");
            let objectStore = transaction.objectStore(parm.objName);
            // 用户读取数据,参数是主键
            let request = objectStore.add({
                id: JSON.stringify(parm.param),
                data: JSON.stringify(parm.response)
            });

我这里储存的是接口数据,将接口的入参当做id,将接口的返回值整个当做data进行存储,不过新增只能被调用一次非常鸡肋,只要在上面创建库表后,这个新增就不需要使用了。

4.修改

    let type = this.getType(parm.param);
            var request = this.db
                .transaction([parm.objName], "readwrite")
                .objectStore(parm.objName)
                .put({
                    id: type ? JSON.stringify(parm.param) : parm.param,
                    data: type ? JSON.stringify(parm.response) : parm.response


修改表的信息,如果创建过表,之后只需要调用修改就可以对数据库表进行新增和修改。id相同时修改,id不同时新增。

5.读取

    let type = this.getType(parm.param);
            var transaction = this.db.transaction([parm.objName]);
            var objectStore = transaction.objectStore(parm.objName);
            // 用户读取数据,参数是主键
            var request = objectStore.get(
                type ? JSON.stringify(parm.param) : parm.param
    request.onsuccess = function(event) {
                if (request.result) {
                    let data = JSON.parse(request.result.data);
                    res(data);
                } else {
                    res(request.result);
                    console.log("未获得数据记录");
            };


只需要传入主键就可以在回调里获得值

6.删除

    let type = this.getType(parm.param);
            var request = this.db
                .transaction([parm.objName], "readwrite")
                .objectStore(parm.objName)
                .delete(type ? JSON.stringify(parm.param) : parm.param);


只需要传入id就可以删除指定表单数据

完整代码

/* 
        dbName: "test",   //数据库名称
        objName: "test1",  // 表名称
        param: { a: 1 },   // id值
        response: {        // 存储的value
          b: 2,
export default class {
    constructor() {
        this.db = null;
    getType(val) {
        let type = typeof val == "object";
        return type;
    // 打开数据库
    open(parm) {
        return new Promise((res, rej) => {
            let request = window.indexedDB.open(parm.dbName, parm.versions);
            request.onerror = function(event) {
                console.log(event);
                // 错误处理
                rej();
                console.log(" 打开数据库报错");
            request.onsuccess = event => {
                this.db = request.result;
                console.log("打开数据库成功");
                res();
                // 成功处理
            // 数据库更新时的回调
            request.onupgradeneeded = event => {
                this.db = event.target.result;
                this.createdDB(parm);
    // 创建库表
    createdDB(parm) {
        if (!this.db.objectStoreNames.contains(parm.objName)) {
            this.db.createObjectStore(parm.objName, {
                keyPath: "id"
            // objectStore.createIndex("data", "data", { unique: false });
            // unique name可能会重复
    // 新增(不需要使用)
    async add(parm = { dbName, objName, param, response }) {
        await this.open(parm);
        // await this.upgrade(dbName);
        return new Promise((res, rej) => {
            let transaction = this.db.transaction([parm.objName], "readwrite");
            let objectStore = transaction.objectStore(parm.objName);
            // 用户读取数据,参数是主键
            let request = objectStore.add({
                id: JSON.stringify(parm.param),
                data: JSON.stringify(parm.response)
            console.log(request);
            request.onsuccess = function(event) {
                res(event);
                console.log("数据写入成功");
            request.onerror = function(event) {
                rej();
                console.log("数据写入失败");
    // 读取库表数据
    async read(parm = { dbName, objName, param, response }) {
        await this.open(parm);
        return new Promise((res, rej) => {
            let type = this.getType(parm.param);
            var transaction = this.db.transaction([parm.objName]);
            var objectStore = transaction.objectStore(parm.objName);
            // 用户读取数据,参数是主键
            var request = objectStore.get(
                type ? JSON.stringify(parm.param) : parm.param
            request.onerror = function(event) {
                console.log("事务失败");
                rej();
            request.onsuccess = function(event) {
                if (request.result) {
                    let data = JSON.parse(request.result.data);
                    res(data);
                } else {
                    res(request.result);
                    console.log("未获得数据记录");
    // 修改库表数据,但是因为创建数据库时直接创建了库表,所以无论是添加还是修改都掉这个就可以了.
    async update(parm = { dbName, objName, param, response }) {
        await this.open(parm);
        return new Promise((res, rej) => {
            let type = this.getType(parm.param);
            var request = this.db
                .transaction([parm.objName], "readwrite")
                .objectStore(parm.objName)
                .put({
                    id: type ? JSON.stringify(parm.param) : parm.param,
                    data: type ? JSON.stringify(parm.response) : parm.response
            request.onsuccess = function(event) {
                res();
                console.log("数据更新成功");
            request.onerror = function(event) {
                rej();
                console.log("数据更新失败");
    // 删除某个表的数据
    async remove(parm = { dbName, objName, param, response }) {
        await this.open(parm);
        return new Promise((res, rej) => {
            let type = this.getType(parm.param);
            var request = this.db
                .transaction([parm.objName], "readwrite")
                .objectStore(parm.objName)
                .delete(type ? JSON.stringify(parm.param) : parm.param);
            request.onsuccess = function(event) {
                res();