前端存儲之indexDB

在講indexDB之前尤泽,先簡單說說cookie脆淹、localStorage、sessionStorage瘫镇。

cookie

Cookie 是小甜餅的意思鼎兽。顧名思義,cookie 確實非常小铣除,它的大小限制為4KB左右谚咬,是網(wǎng)景公司的前雇員 Lou Montulli 在1993年3月的發(fā)明。它的主要用途有保存登錄信息尚粘,比如你登錄某個網(wǎng)站市場可以看到“記住密碼”择卦,這通常就是通過在 Cookie 中存入一段辨別用戶身份的數(shù)據(jù)來實現(xiàn)的。

localStorage

localStorage 是 HTML5 標準中新加入的技術(shù)郎嫁,它并不是什么劃時代的新東西秉继。早在 IE 6 時代,就有一個叫 userData 的東西用于本地存儲泽铛,而當時考慮到瀏覽器兼容性尚辑,更通用的方案是使用 Flash。而如今盔腔,localStorage 被大多數(shù)瀏覽器所支持杠茬,如果你的網(wǎng)站需要支持 IE6+,那以 userData 作為你的 polyfill 的方案是種不錯的選擇弛随。

sessionStorage

sessionStorage 與 localStorage 的接口類似瓢喉,但保存數(shù)據(jù)的生命周期與 localStorage 不同。 Session 這個詞的意思舀透,直譯過來是“會話”灯荧。它只是可以將一部分數(shù)據(jù)在當前會話中保存下來,刷新頁面數(shù)據(jù)依舊存在盐杂。但當頁面關(guān)閉后逗载,sessionStorage 中的數(shù)據(jù)就會被清空。

Desktop Chrome Edge Firefox Internet Explorer Opera Safari
localStorage 4 Yes 3.5 8 10.5 4
sessionStorage 5 Yes 2 8 10.5 4
Mobile Android webview Chrome for Android Edge Mobile Firefox for Android Opera for Android iOS Safari
localStorage Yes Yes Yes Yes 10.5 3.2
sessionStorage Yes Yes Yes Yes 11 3.2

cookie链烈、localStorage厉斟、sessionStorage異同

特性 Cookie localStorage sessionStorage
數(shù)據(jù)的生命期 一般由服務(wù)器生成,可設(shè)置失效時間强衡。如果在瀏覽器端生成Cookie擦秽,默認是關(guān)閉瀏覽器后失效 除非被清除,否則永久保存 僅在當前會話下有效,關(guān)閉頁面或瀏覽器后被清除
存放數(shù)據(jù)大小 4K左右 一般為5MB 一般為5MB
與服務(wù)器端通信 每次都會攜帶在HTTP頭中感挥,如果使用cookie保存過多數(shù)據(jù)會帶來性能問題 僅在客戶端(即瀏覽器)中保存缩搅,不參與和服務(wù)器的通信 僅在客戶端(即瀏覽器)中保存,不參與和服務(wù)器的通信
易用性 需要程序員自己封裝触幼,源生的Cookie接口不友好 源生接口可以接受硼瓣,亦可再次封裝來對Object和Array有更好的支持 源生接口可以接受,亦可再次封裝來對Object和Array有更好的支持

接下來就開始上重頭戲了 —— indexDB

indexDB

隨著瀏覽器的功能不斷增強置谦,越來越多的網(wǎng)站開始考慮堂鲤,將大量數(shù)據(jù)儲存在客戶端,這樣可以減少從服務(wù)器獲取數(shù)據(jù)媒峡,直接從本地獲取數(shù)據(jù)瘟栖。

通俗地講,IndexedDB 就是瀏覽器提供的本地數(shù)據(jù)庫谅阿,它可以被網(wǎng)頁腳本創(chuàng)建和操作半哟。IndexedDB 允許儲存大量數(shù)據(jù),提供查找接口签餐,還能建立索引寓涨。這些都是 LocalStorage 所不具備的。就數(shù)據(jù)庫類型而言贱田,IndexedDB 不屬于關(guān)系型數(shù)據(jù)庫(不支持 SQL 查詢語句),更接近 NoSQL 數(shù)據(jù)庫嘴脾。

操作步驟

查看更多信息參考

  • 創(chuàng)建/打開數(shù)據(jù)庫男摧。
  • 在數(shù)據(jù)庫中創(chuàng)建一個對象倉庫(object store)。
  • 啟動一個事務(wù)译打,并發(fā)送一個請求來執(zhí)行一些數(shù)據(jù)庫操作耗拓,像增加或提取數(shù)據(jù)等。
  • 通過監(jiān)聽正確類型的 DOM 事件以等待操作完成奏司。
  • 在操作結(jié)果上進行一些操作(可以在 request 對象中找到)

打開數(shù)據(jù)庫

var db = null;
var request = window.indexedDB.open("MyTestDatabase");
request.onerror = function(event) {
  // 錯誤處理
  console.log(' 打開數(shù)據(jù)庫報錯');
};
request.onsuccess = function(event) {
  // 成功處理
  db = event.target.result;
  console.log('打開數(shù)據(jù)庫成功');
};

創(chuàng)建和更新數(shù)據(jù)庫版本號

如果指定的版本號乔询,大于數(shù)據(jù)庫的實際版本號,就會發(fā)生數(shù)據(jù)庫升級事件upgradeneeded韵洋。這時通過事件對象的target.result屬性竿刁,拿到數(shù)據(jù)庫實例。

var db = null;
request.onupgradeneeded = function (event) {
  db = event.target.result;
}

新建數(shù)據(jù)庫

新建數(shù)據(jù)庫與打開數(shù)據(jù)庫是同一個操作搪缨。如果指定的數(shù)據(jù)庫不存在食拜,就會新建。不同之處在于副编,后續(xù)的操作主要在upgradeneeded事件的監(jiān)聽函數(shù)里面完成负甸,因為這時版本從無到有,所以會觸發(fā)這個事件。

通常呻待,新建數(shù)據(jù)庫以后打月,第一件事是新建對象倉庫(即新建表)。

request.onupgradeneeded = function(event) {
  db = event.target.result;
  var objectStore = null;
  if (!db.objectStoreNames.contains('imgLists')) {
    objectStore = db.createObjectStore('imgLists', { keyPath: 'id' });
    // unique name可能會重復
    objectStore.createIndex('name', 'name', { unique: false });
  }
}

創(chuàng)建一張叫imgLists的表格蚕捉,主鍵是id奏篙。

寫入數(shù)據(jù)

新增數(shù)據(jù)指的是向?qū)ο髠}庫寫入數(shù)據(jù)記錄。這需要通過事務(wù)完成鱼冀。

// new 一個blob對象
var obj1 = {hello: "world"};
var blob = new Blob([JSON.stringify(obj1, null, 2)], {type : 'application/json'});

function add() {
  var request = db.transaction(['imgLists'],  'readwrite')
    .objectStore('imgLists')
    .add({ id: 1, name: '圖片1', path: '/static/image', blob:  blob});

  request.onsuccess = function (event) {
    console.log('數(shù)據(jù)寫入成功');
  };

  request.onerror = function (event) {
    console.log('數(shù)據(jù)寫入失敗');
  }
}

查詢數(shù)據(jù)

查詢數(shù)據(jù)也是通過事物完成报破。

function read() {
   var transaction = db.transaction(['imgLists']);
   var objectStore = transaction.objectStore('imgLists');
   // 用戶讀取數(shù)據(jù),參數(shù)是主鍵
   var request = objectStore.get(1);

   request.onerror = function(event) {
     console.log('事務(wù)失敗');
   };

   request.onsuccess = function( event) {
      if (request.result) {
        console.log(request.result);
      } else {
        console.log('未獲得數(shù)據(jù)記錄');
      }
   };
}

遍歷數(shù)據(jù)

遍歷數(shù)據(jù)表格的所有記錄千绪,要使用指針對象 IDBCursor充易。

function readAll() {
  var objectStore = db.transaction('imgLists').objectStore('imgLists');

   objectStore.openCursor().onsuccess = function (event) {
     var cursor = event.target.result;

     if (cursor) {
       console.log(cursor);
       cursor.continue();
    } else {
      console.log('沒有更多數(shù)據(jù)了!');
    }
  };
}

更新數(shù)據(jù)

function update() {
  var request = db.transaction(['imgLists'], 'readwrite')
    .objectStore('imgLists')
    // 主動更新主鍵為1
    .put({ id: 1, name: '圖片2',  path: '/static/image2'});

  request.onsuccess = function (event) {
    console.log('數(shù)據(jù)更新成功');
  };

  request.onerror = function (event) {
    console.log('數(shù)據(jù)更新失敗');
  }
}

刪除數(shù)據(jù)

function remove() {
  var request = db.transaction(['imgLists'], 'readwrite')
    .objectStore('imgLists')
    .delete(1);

  request.onsuccess = function (event) {
    console.log('數(shù)據(jù)刪除成功');
  };
}

remove();

創(chuàng)建/使用索引

索引的意義在于荸型,可以讓你搜索任意字段盹靴,也就是說從任意字段拿到數(shù)據(jù)記錄。如果不建立索引瑞妇,默認只能搜索主鍵(即從主鍵取值)稿静。

    objectStore.createIndex('name', 'name', { unique: false });
    function findIndex() {
      var transaction = db.transaction(['imgLists'], 'readonly');
      var store = transaction.objectStore('imgLists');
      var index = store.index('name');
      var request = index.get('圖片1');

      request.onsuccess = function (e) {
        var result = e.target.result;
        if (result) {
          console.log(result);
        } else {
          // ...
        }
      }
    }

使用場景

indexDB是一個瀏覽器使用簡易的數(shù)據(jù)庫。隨著前端功能復雜度提升辕狰,用戶需要多元化改备,前端indexDB應用也就越來越多。桌面應用蔓倍、Progressive Web App(PWA)悬钳、chrome擴展組件的開發(fā)等。用戶同時會獲取/操作更多的信息偶翅,怎么留存這些大量的數(shù)據(jù)默勾,那么我們的indexDB就上線了。案例:DevDocs聚谁,electron開發(fā)的桌面應用(圖片傳輸)母剥。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市形导,隨后出現(xiàn)的幾起案子环疼,更是在濱河造成了極大的恐慌,老刑警劉巖朵耕,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秦爆,死亡現(xiàn)場離奇詭異,居然都是意外死亡憔披,警方通過查閱死者的電腦和手機等限,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門爸吮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人望门,你說我怎么就攤上這事形娇。” “怎么了筹误?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵桐早,是天一觀的道長。 經(jīng)常有香客問我厨剪,道長哄酝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任祷膳,我火速辦了婚禮陶衅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘直晨。我一直安慰自己搀军,他們只是感情好,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布勇皇。 她就那樣靜靜地躺著罩句,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敛摘。 梳的紋絲不亂的頭發(fā)上门烂,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音兄淫,去河邊找鬼屯远。 笑死,一個胖子當著我的面吹牛拖叙,可吹牛的內(nèi)容都是我干的氓润。 我是一名探鬼主播赂乐,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼薯鳍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挨措?” 一聲冷哼從身側(cè)響起挖滤,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浅役,沒想到半個月后斩松,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡觉既,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年惧盹,在試婚紗的時候發(fā)現(xiàn)自己被綠了乳幸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡钧椰,死狀恐怖粹断,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嫡霞,我是刑警寧澤瓶埋,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站诊沪,受9級特大地震影響养筒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜端姚,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一晕粪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寄锐,春花似錦兵多、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盆顾,卻和暖如春怠褐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背您宪。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工奈懒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宪巨。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓磷杏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捏卓。 傳聞我的和親對象是個殘疾皇子极祸,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 本文介紹本地數(shù)據(jù)存儲的選型。簡單總結(jié)一些查詢到的關(guān)于本地數(shù)據(jù)存儲的技術(shù)怠晴。 控制臺展示前端存儲 Chrome: 前端...
    謝大見閱讀 9,068評論 1 8
  • 本文是我今年2月份發(fā)表在博客園上的文章遥金,平常做項目時便溫故一下。私以為蒜田,只有通過實踐才能將知識真正地內(nèi)化和吸收稿械,再...
    一個笑點低的妹紙閱讀 839評論 0 2
  • 一、前言 學習前端的可以關(guān)注網(wǎng)頁制作web前端部落哦冲粤,每天更新干貨美莫。web前端技術(shù)日新月異页眯,對于瀏覽器的存儲來說,...
    強哥科技興閱讀 876評論 0 0
  • 今天是什么日子 起床:6.00 就寢:11.30 天氣:晴 心情:本來下午4點多鐘就下班了厢呵,想去健身房鍛煉下餐茵,可是...
    唐青城閱讀 154評論 0 0
  • 現(xiàn)在有很多關(guān)于熬夜網(wǎng)絡(luò)用詞忿族,比如熬夜冠軍、月亮不睡你不睡蝌矛,你是禿頭小寶貝~等一些比較流行的道批,導致了現(xiàn)在很多網(wǎng)友都喜...
    努力上進的girl閱讀 325評論 0 1