浏览器数据库IndexDB

1. 前言

最近刚入职在看新项目的代码,学习了很多新的代码封装思路和模块化的思想。而且也了解到了IndexedDB数据库的使用方法,开一篇文章来总结下IndexedDB在项目中的使用。

2. IndexedDB

2-1. IndexedDB是什么

通俗地说,IndexedDB就是浏览器提供的本地数据库,它可以被网页脚本创建和操作。

2-2. 为什么要使用它

以往做网页存储,我们一般使用cookielocalStorage或者sessionStorage。但是这两种方法一个存储的空间有限,一个也只能建立很简单的对象设置和获取属性。而IndexedDB不仅能存储大量数据,而且还能建立索引和提供查找接口。在大型项目中会有很大的优势。

关于IndexedDB的特点和基本概念阮老师的博客写的很清楚。我这里不做概述。本篇文章只是为了记录下我现在的项目中是如何使用IndexedDB,介绍基本的使用方法。浏览器数据库

3. 使用方法

3-1. 打开或者新建数据库

// 获取indexedDB数据对象
const indexedDB  = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB
// 打开或者新建数据库
/**
 * @param {string} databaseName: 打开/新建的数据库名称
 * @param {string} version: 数据库版本号
 */
let dbRequest = window.indexedDB.open(databaseName, version);

3-2. 设置不同的处理方法

打开数据库后我们能拿到一个IndexDBRequest对象,这个对象有三个处理事件的方法,来处理打开或者新增数据库的操作结果

  1. success事件
dbRequest.onsuccess = event => {
  console.log("数据库打开成功");
  // 数据库的实例对象
  const db = event.target.result;
}
  1. error事件
dbRequest.onerror = event => {
  console.log("数据库打开失败");
}
  1. upgradeneeded事件
  • 对于打开数据库来说如果指定的版本大于数据库的实际版本就会这个数据库升级事件,一般来说不会处理这个
// 打开已有数据库如果指定的version高于当前数据的version
window.indexedDB.open(databaseName, version);
dbRequest.onupgradeneeded = event => {
  console.log("数据库需要升级");
}
  • 对于新建数据库,没有版本,新建的时候就会直接触发这个事件,通常我们会在这个事件中区新增数据库表和索引。
dbRequest.onupgradeneeded = event => {
     // 通过事件对象的`target.result`创建新的数据库表
     const db = event.target.result;
     // 创建前先判断该数据库表是否存在
     if (!db.objectStoreNames.contains("test")) {
        // 创建名为`test`的数据库表并指定主键为`id`
        let objectStore = db.createObjectStore("test", { keyPath: "id" });  
        // 如果数据记录里面没有合适作为主键的属性,那么可以让 IndexedDB 自动生成主键。
        // let objectStore = db.createObjectStore("test", { autoIncrement: true });

        // 创建索引
        /**
         * @param {string} 索引名称
         * @param {string} 索引所在的属性
         * @param {object} 配置对象: 说明该属性是否包含重复的值
         */
        objectStore.createIndex("id", "id", { unique: true });
        objectStore.createIndex("value", "value", { unique: true });
     }
 };

3-3. 操作数据

操作数据分为新增读取更新删除等。这些操作都需要通过事务完成。

// 打开数据库开始操作数据
dbRequset.onsuccess = event => {
  // 新建事务
  // 新建时必须指定表格名称和操作模式("只读"或"读写")
  const trans = db.transaction(["test"], "readwrite");
  // 拿到IDBObjectStore对象
  const dictStore = trans.objectStore("test");
  // 通过IDBObjectStore对象操作数据

  // 读取数据
  const getResp = disStore.get("1");
  // 新增数据
  const addResp = disStore.add({ id: 1, value: "test"});
  // 更新数据
  const putResp = disStore.put({ id: 1, value: "test1"});
  // 删除数据
  const deleteResp = disStore.delete(1);

  // 上述几种操作数据库的方法都会返回一个连接对象
  // 通过监听返回的连接对象来判断是否操作成功
   getResp.onerror = function(event) {
     console.log('事务失败');
   };

   getResp.onsuccess = function( event) {
      if (request.result) {
        console.log('value: ' + request.result.value);
      } else {
        console.log('未获得数据记录');
      }
   };
}

3-4. 使用索引

我们在上面对value字段建立了索引

objectStore.createIndex("value", "value", { unique: true });

所以我们可以通过索引value去查找数据了

  // 也要先创建事务指定为只读
  const trans = db.transaction(["test"], "readonly");
  // 拿到IDBObjectStore对象
  const dictStore = trans.objectStore("test");
  // 拿到连接对象
  let request = dictStore.index("value").get("test");
  request.onsuccess = function(event) {
      if (event.target.result) {
        console.log(event.target.result);
      } else {
        console.log('未获得数据记录');
      }
   };

最近项目中用到了很多新技术,微前端,发布组件,浏览器数据库等等,我目前也在一边学习一边总结。如果这篇文章对大家有帮助的话点个赞呗❤️❤️

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容