浏览器数据库 IndexDB 封装示例

浏览器数据库 IndexDB 封装示例

博主wx: -GuanEr-,加博主进前端交流群

感谢阮一峰大佬的技术分享

JS 封装示例

// indexDB.js 

// 打开或创建数据库(如果已经存在就打开,否则就创建)
var dbName = 'project';
// success, error 可以不传
function openDB(version, success, error) {
  var req = indexedDB.open(dbName, version);
  req.onsuccess = function() {
    success && (typeof success == 'function') ? success() : '';
  };
  req.onerror = function() {
    console.error('数据库打开或创建失败,请重试');
    // 如果用户传递了回调函数,那就调用,否则不反馈
    error && (typeof error == 'function') ? error() : '';
  };
  return req;
}

/* 创建数据表,每创建一个数据表,数据库的版本都要 +1(初始版本是 1)
 * dbVersion: 数据库版本
 * tabName: 要创建的表格的名称
 * key: 主键, 如果需要自动生成,key 就传 '',否则 key 就是主键名称
 * keyList: 数组,表格中的键的列表,示例数据:
 *          [{
 *             name: 'username', // 键的名称
 *             unique: true // 用户明是否唯一,如果唯一,为true
 *          },{
 *             name: 'email',
 *             unique: true
 *          },{
 *             name: 'tel',
 *             unique: false
 *          }]
 * success: 表格创建成功之后的回调,可以不传
 * error: 表格创建之后的回调,可以不传
 */
function createTable(dbVersion, tabName, key, keyList, success, error) {
  var req = openDB(dbVersion, success, error);

  req.onupgradeneeded = function(e) {
    var db = e.target.result;

    // 创建一张数据表
    var obj = key ? {keyPath: key} : {autoIncrement: true};
    var store = db.createObjectStore(tabName, obj);
    keyList.forEach(function(item) {
      store.createIndex(item.name, item.name, {unique: item.unique});
    });
  };
}

// 获取objectStore 对象的公共函数
function getStore(e, tabName) {
  var db = e.target.result;
  var transaction = db.transaction([tabName], "readwrite");
  return transaction.objectStore(tabName);
}

/*
 * 向数据库中添加数据:
 * dbVersion: 数据库的版本号(最新)
 * tabName: 要添加数据的表格
 * data: 要添加的数据,是个对象,对象中是这个表格中的所有的键值对列表
 * success: 数据添加成功的回调
 * fail: 数据添加失败的回调
 * */
function add(dbVersion, tabName, data, success, fail) {
  var req = openDB(dbVersion);
  req.onsuccess = function(e) {
    var store = getStore(e, tabName);
    var request = store.add(data);
    request.onsuccess = function() {
      success && (typeof success == 'function') ? success() : '';
    };
    request.onerror = function() {
      fail && (typeof fail == 'function') ? fail() : '';
    };
  };
}

/* 根据主键获取数据:
 * dbVersion: 要操作的数据库的版本号(最新)
 * tabName: 表格名称
 * key: 要获取的数据的主键
 * */
function getData(dbVersion, tabName ,key, success, error) {
  var req = openDB(dbVersion);
  req.onsuccess = function(e) {
    var store = getStore(e, tabName);
    var request = store.get(key);
    request.onsuccess = function(e) {
      success && (typeof success == 'function') ? success(request.result) : '';
    };
    request.onerror = function(e) {
      error && (typeof error == 'function') ? error() : '';
    };
  };
}

/*
 * 获取某个数据表中的数据列表:
 * dbVersion: 数据库的最新版本号
 * tabName: 要获取数据的数据表名
 * */
function getList(dbVersion, tabName, success) {
  var req = openDB(dbVersion);
  req.onsuccess = function(e) {
    var store = getStore(e, tabName);
    var arr = []; // 要承接所有的返回列表
    store.openCursor().onsuccess = function(event) {
      var cursor = event.target.result;
      if (cursor) {
        arr.push(cursor.value); // 将当次拿到的值 push 到了arr 中
        cursor.continue(); // 循环
      } else {
        success && typeof success == 'function' ? success(arr) : '';
      }
    };
  };
}

/* 根据主键删除数据:
 * dbVersion: 数据库最新版本号
 * tabName: 要删除数据的数据表
 * key: 要删除的数据的主键值
 * success: 删除成功的回调
 * error: 删除失败的回调
 * */
function deleteData(dbVersion, tabName, key, success, error) {
  var req = openDB(dbVersion);
  req.onsuccess = function(e) {
    var db = e.target.result;
    var request = db.transaction([tabName], "readwrite").objectStore(tabName).delete(key);
    request.onsuccess = function(e) {
      // 删除成功!
      success && (typeof success == 'function') ? success() : '';
    };
    request.onerror = function() {
      error && (typeof error == 'function') ? error() : '';
    };
  };
}

/* 修改数据 */
function update(dbVersion, tabName, key, newData, success, error) {
  var req = openDB(dbVersion);
  req.onsuccess = function(e) {
    var store = getStore(e, tabName);
    var request = store.get(key);
    request.onerror = function () {
      console.error('内部服务器错误');
    };
    request.onsuccess = function(ev) {
      var data = ev.target.result;
      for(var k in newData) {
        data[k] = newData[k];
      }
      var requestUpdate = store.put(data);
      requestUpdate.onerror = function() {
        // 错误处理
        error && (typeof error == 'function') ? error() : '';
      };
      requestUpdate.onsuccess = function() {
        success && typeof success == 'function' ? success() : '';
      };
    };
  };
}

调用示例

<script src="indexDB.js"></script>
<script>
  createTable(3, 'test', 'ID', [
    {name: 'key1', unique: false},
    {name: 'key2', unique: false}
  ], function() {
  	// 成功的回调
  }, function() {
  	// 失败的回调
  });
  deleteData(3, 'good', 4, function() {
    console.log(1);
  }, function() {
    console.log(0);
  });
  update(3, 'good', 5, {
    tel: 'ne1',
    email: 'ne1'
  });
</script>

扫码拉你进入前端技术交流群

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锋利的二丫

如果对您有帮助,请博主喝杯奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值