IndexedDB: 瀏覽器里內置的資料庫簡介

来源:http://www.cnblogs.com/weilei92/archive/2016/10/21/5986154.html
-Advertisement-
Play Games

一、概述: 所有的應用程式都需要“數據”支持。對於大多數的Web應用程式來說,數據是在伺服器端進行組織和整理,然後由客戶端(瀏覽器端)通過網路請求獲取。隨著瀏覽器的處理能力不斷增強,可以在瀏覽器端存儲和操縱應用程式需要的數據,因此越來越多的網站開始考慮,將大量數據儲存在本地客戶端,這樣可以減少用戶等 ...


一、概述:

所有的應用程式都需要“數據”支持。對於大多數的Web應用程式來說,數據是在伺服器端進行組織和整理,然後由客戶端(瀏覽器端)通過網路請求獲取。隨著瀏覽器的處理能力不斷增強,可以在瀏覽器端存儲和操縱應用程式需要的數據,因此越來越多的網站開始考慮,將大量數據儲存在本地客戶端,這樣可以減少用戶等待從伺服器端獲取數據的時間。

現有的瀏覽器端數據儲存方案,都不適合儲存大量數據。Cookie不超過4KB,且每次請求都會發送回伺服器端;Window.name屬性缺乏安全性,且沒有統一的標準;LocalStorage容量在2.5MB到10MB之間,且其以字元串形式進行存儲。因此,需要一種新的技術解決方案,這就是IndexedDB誕生的背景。

IndexedDB 是一種瀏覽器端文檔資料庫,可以被網頁腳本程式創建和操作。它允許儲存大量數據,並且提供查詢介面,且可以建立索引。這些特性都是localStorage技術所不具備的。就資料庫類型而言,IndexedDB不屬於關係型資料庫(不支持SQL查詢語句),更接近NoSQL資料庫。關係型資料庫(如SQL Server,MySQLOracle等)的數據存儲在表中;文檔資料庫(如MongoDB,CouchDB,Redis)將數據集作為個體對象來存儲。 
通過使用IndexedDB,開發者可以通過慣於在伺服器端資料庫幾乎相同的方式進行創建、讀取、更新和刪除大量數據記錄的操作。

IndexedDB具備以下幾項特點: 
(1) 鍵值對儲存(Key-Value) 
IndexedDB內部採用對象倉庫(object store)存放數據。所有類型的數據都可以直接存入,包括JavaScript對象。在對象倉庫中,數據以“鍵值對”的形式保存,每一個數據都有對應的鍵名,且鍵名必須是獨一無二的,不能有重覆,否則會拋出錯誤。

(2) 非同步API(asynchronous API ) 
IndexedDB資料庫在執行增、刪、改和查的操作時不會鎖死瀏覽器,用戶依然可以進行其它操作。相比之下,localStorage的操作都是同步的。非同步設計是為了防止大量數據的讀寫時拖慢網頁,而影響用戶的網站體驗。

(3) 支持事務(transaction) 
IndexedDB支持事務(transaction),這意味著一系列操作步驟之中,只要有一步失敗,整個事務就都取消,資料庫回到事務發生之前的狀態,不存在只改寫一部分數據的情況。

(4) 同域限制 
IndexedDB也受到同域限制,每一個資料庫對應創建該資料庫的功能變數名稱。來自不同功能變數名稱的網頁,只能訪問自身功能變數名稱下的資料庫,而不能訪問其他功能變數名稱下的資料庫。

(5) 存儲空間大 
IndexedDB的存儲空間比localStorage大得多,一般來說不少於250MB。IE的儲存上限是250MB,Chrome和Opera是硬碟剩餘空間的某個百分比,Firefox則沒有上限。

(6) 支持二進位儲存 
IndexedDB不僅可以儲存字元串,還可以儲存二進位數據。

二、IndexedDB VS LocalStorage, Web SQL, Cookies

IndexedDB VS LocalStorage

IndexedDB和LocalStorage都是用來在瀏覽器里存儲數據,但它們使用不同的技術,有不同的用途,你需要根據自己的情況適當的選擇使用哪種。

LocalStorage是用key-value鍵值模式存儲數據,但跟IndexedDB不一樣的是,它的數據並不是按對象形式存儲。它存儲的數據都是字元串形式。如果你想讓LocalStorage存儲對象,你需要藉助JSON.stringify()能將對象變成字元串形式,再用JSON.parse()將字元串還原成對象。但如果要存儲大量的複雜的數據,這並不是一種很好的方案。畢竟,localstorage就是專門為小數量數據設計的,它的api是同步的。

IndexedDB很適合存儲大量數據,它的API是非同步調用的。IndexedDB使用索引存儲數據,各種資料庫操作放在事務中執行。IndexedDB甚至還支持簡單的數據類型。IndexedDB比localstorage強大得多,但它的API也相對複雜。對於簡單的數據,你應該繼續使用localstorage,但當你希望存儲大量數據時,IndexedDB會明顯的更適合,IndexedDB能提供給你更為複雜的查詢數據的方式。

IndexedDB VS Web SQL

WebSQL也是一種在瀏覽器里存儲數據的技術,跟IndexedDB不同的是,IndexedDB更像是一個NoSQL資料庫,而WebSQL更像是關係型資料庫,使用SQL查詢數據。W3C已經不再支持這種技術。具體情況請看:http://www.w3.org/TR/webdatabase/。因為不再支持,所以你就不要在項目中使用這種技術了。

IndexedDB VS Cookies

Cookies(小甜點)聽起來很好吃,但實際上並不是。每次HTTP接受和發送都會傳遞Cookies數據,它會占用額外的流量。例如,如果你有一個10KB的Cookies數據,發送10次請求,那麼,總計就會有100KB的數據在網路上傳輸。Cookies只能是字元串。瀏覽器里存儲Cookies的空間有限,很多用戶禁止瀏覽器使用Cookies。所以,Cookies只能用來存儲小量的非關鍵的數據。

三、IndexedDB架構及技術實現

IndexedDB的架構很像在一些流行的伺服器端NoSQL資料庫實現中的設計典範類型。面向對象數據通過object stores(對象倉庫)進行持久化,所有操作基於請求同時在事務範圍內執行;事件生命周期使你能夠控制資料庫的配置,錯誤通過錯誤冒泡來使用API管理。

IndexedDB之打開資料庫的請求生命周期(Life cycle)

瀏覽器原生提供indexedDB對象,可以通過window.indexedDB來直接獲取到瀏覽器提供的該對象,作為開發者的操作介面。IndexedDB.open方法用於打開瀏覽器本地資料庫。 
IndexedDB使用事件生命周期管理資料庫的打開和配置操作。

IndexedDB之基於請求(Request)

對資料庫的每次操作,可以描述為通過一個請求打開資料庫,訪問一個object store,再繼續。IndexedDB API天生是基於請求的,這也是非同步API本性所示。對於在資料庫執行的每次操作,都必須首先為這個操作創建一個請求。當該請求完成,可以響應由請求結果產生的事件或錯誤。

IndexedDB之對象倉庫(Object Store)

Object store是IndexedDB資料庫的基礎。Object store相當於關係型資料庫中的一張張記錄數據的表。Object stores中包括一個或多個索引(index),在store中按照一對鍵-值操作,這提供了一種快速定位數據的方法。

IndexedDB之一切操作基於事務(Transaction)

不同於一些傳統的關係資料庫的實現,每一個對資料庫操作是在一個事務的上下文中執行的。事務範圍一次影響一個或多個object stores,你通過傳入一個object store名字的數組到創建事務範圍的函數來定義。

創建事務的第二個參數是事務模式。當請求一個事務時,必須決定是按照只讀(ReadOnly)還是讀寫(ReadWrite)模式請求訪問。事務是資源密集型的,所以如果你不需要更改data store中的數據,你只需要以只讀模式對object stores集合進行請求訪問。

IndexedDB之錯誤冒泡

當然,有時候,請求可能不會按預期完成。IndexedDB API通過錯誤冒泡功能來幫助跟蹤和管理錯誤。如果一個特定的請求遇到錯誤,你可以嘗試在請求對象上處理錯誤,或者你可以允許錯誤通過調用棧冒泡向上傳遞。這個冒泡天性,使得你不需要為每個請求實現特定錯誤處理操作,而是可以選擇只在一個更高級別上添加錯誤處理,它給你一個機會,保持你的錯誤處理代碼簡潔。 
Try……catch機制。

四、w3c中關於IndexedDB基本用法及API

http://www.w3.org/TR/IndexedDB/#dfn-invalidstateerror

五、IndexedDB參考資料

    1. IndexedDB:瀏覽器里內置的資料庫, Web駭客 
      http://www.webhek.com/indexeddb/
    2. 前端的資料庫:IndexedDB入門(很全面) 
      http://web.jobbole.com/81793/
    3. IndexedDB:瀏覽器端資料庫, 阮一峰《JavaScript標準參考教程(alpha)》 
      http://javascript.ruanyifeng.com/bom/indexeddb.html
    4. HTML5本地存儲——IndexedDB 
      http://www.cnblogs.com/dolphinX/p/3415761.html (一、基本使用) 
      http://www.cnblogs.com/dolphinX/p/3415761.html (二、索引)
    5. HTML5之IndexedDB使用詳解 
      http://rainsilence.iteye.com/blog/984569
    6. W3C: Indexed Database API 
      http://www.w3.org/TR/IndexedDB/#dfn-invalidstateerror
    7. Dive into HTML5: 本地存儲 
      http://www.devbean.net/2011/06/dive-into-html5-localstorage/
    8. Angular-indexedDB 
      https://github.com/bramski/angular-indexedDB
    9. HTML5 Local Storage本地存儲 
      http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2016-10-22 12:22:42 相關概念 AJAX(Asynchronous Javascript And XML)即“非同步JavaScript和XML”; 是指一種實現客戶端和伺服器的數據傳遞的網頁開發技術; 核心:局部刷新,非同步載入; 即“在不需要刷新頁面的情況下,就可以與Web伺服器交 ...
  • IndexedDB是HTML5規範里新出現的瀏覽器里內置的資料庫。對於在瀏覽器里存儲數據,你可以使用cookies或local storage,但它們都是比較簡單的技術,而IndexedDB提供了類似資料庫風格的數據存儲和使用方式。存儲在IndexedDB里的數據是永久保存,不像cookies那樣只 ...
  • 在這園子里看到了很多優秀的資源,自己也想寫寫東西,就突然想到了以前遇到寫sass的時候出現中文亂碼的解決方案。所有就自己又總結了一下。(以下測試步驟都是自己完成的!沒有任何轉載,如有錯誤,希望大家指正) 簡單說明下:sass來編寫css樣式方便了很多,讓我們本來沒有邏輯處理能力的css語法,在sas ...
  • 箭頭函數(Arrow Functions) 就像名字所說那樣,箭頭函數使用箭頭(=>)來定義函數。與傳統函數相比,箭頭函數在多個地方表現不一樣。 箭頭函數語法(Arrow Function Syntax) 箭頭函數有多種實現方法。比如你想實現一個只有一個參數並且直接返回此參數值的函數: 上面的例子中 ...
  • HTML 語法 用兩個空格來代替製表符(tab) -- 這是唯一能保證在所有環境下獲得一致展現的方法。 嵌套元素應當縮進一次(即兩個空格)。 對於屬性的定義,確保全部使用雙引號,絕不要使用單引號。 不要在自閉合(self-closing)元素的尾部添加斜線 --HTML5 規範中明確說明這是可選的。... ...
  • 今天電腦按了一下xampp,結果運行wamp的時候,出現了下麵的情況: 在網上查了一下,結果是埠被占用,然後我就手動修改了一下。 1.修改xampp的埠號 依次找到:XAMPP的安裝目錄(比如D:\xampp)\apache\conf\httpd.conf,用記事本或notepad等工具打開ht ...
  • js做全選,用一個checkbox覆選框做多個checkbox覆選框的全選按鈕,有一個覆選框未被選擇時,全選按鈕的checked就為false ...
  • 為了讓裡面支持中文,我們加入這句話header("content-type:text/html;charset=utf-8"),此時的tigong.php如下 用我們的瀏覽器跑一下,如圖:將地址欄的信息地址複製一份,用postman測一下數據,如果不知道什麼是postman,請自行百度,後面的數據交 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...