前端數據庫:IndexedDB 基礎使用

前言

在現代 Web 開發中,隨著應用程序復雜度的增加,對本地存儲的需求也越來越高。雖然 localStorage 和 sessionStorage 可以滿足一些簡單的數據存儲需求,但當需要存儲大量結構化數據或進行復雜查詢時,它們就顯得力不從心了。這時候,IndexedDB 就成為了一個強大的選擇。本文將帶你全面了解 IndexedDB 的使用,從基礎操作到高級技巧,助你在項目中靈活應用。



1. IndexedDB 是什么?為啥要用它?

首先,IndexedDB 是瀏覽器內置的一個 NoSQL 數據庫。它和傳統的關系型數據庫不同,更像是一個鍵值對存儲,但功能更強大。它的特點可以用幾個關鍵詞來概括:

  • 大容量:通常可以存儲幾百 MB 甚至 GB 級別的數據,非常適合需要離線存儲的應用。
  • 異步操作:所有操作都是非阻塞的,不會讓頁面卡頓。
  • 復雜查詢:支持索引和游標,可以高效地查詢和遍歷數據。
  • 事務支持:可以確保數據的完整性和一致性。

舉個簡單的例子,如果你在開發一個需要用戶離線使用的筆記應用,或者一個需要存儲大量用戶數據的復雜表單,IndexedDB 絕對是你的好幫手!



2. indexedDB 數據庫的使用

2.1. 查看indexedDB

indexDB 其實是 window 對象的一個屬性。 也就是全局變量。 因此我們可以在控制臺直接輸出

在這里插入圖片描述

在這里插入圖片描述

通過在控制臺中輸出 indexDB 對象,我們可以一目了然地看到它所提供的各種方法。


2.2. 打開和創建數據庫

首先要掌握的就是它的核心方法之一 的open()open() 方法用于打開或創建一個數據庫,并返回一個 IDBOpenDBRequest 對象,這個對象代表了異步操作的請求。通過IDBOpenDBRequest ,我們可以監聽數據庫的打開狀態,并進一步執行后續操作。

在這里插入圖片描述

在這里插入圖片描述


Open() 參數

讓我們來詳細了解一下 open() 方法的兩個參數:

  1. 第一個參數(必傳):數據庫名稱。用于指定你要打開或創建的數據庫的名稱。
  2. 第二個參數(可選):數據庫版本號。不傳默認值為 1。

在我們成功創建數據庫后,可以通過瀏覽器的開發者工具中 Application 面板直觀地看到數據庫的名稱以及當前版本號

在這里插入圖片描述

當你需要升級數據庫結構(例如新增或修改對象存儲空間)時,可以通過指定一個更高的版本號來觸發 upgradeneeded 事件,進而完成數據庫的更新操作。

這兩個參數為 open() 方法提供了靈活性,既確保了操作的明確性,也為數據庫的版本管理提供了支持。📚


Open() 返回值

open() 方法會返回一個 IDBOpenDBRequest 對象,這是因為 IndexedDB 中的所有操作(包括打開、讀取、編輯和刪除) ,都是異步執行的。由于這些操作可能需要一定的時間才能完成,無法立即返回結果,因此 IDBOpenDBRequest 對象提供了一系列事件綁定機制,方便我們在操作的不同階段(如成功、失敗或數據庫需要升級時)進行相應的處理。通過監聽這些事件,開發者可以更靈活地控制數據庫操作的流程和響應。

在這里插入圖片描述

在 IndexedDB 中,版本號是一個重要的機制,用于管理數據庫的更新和變更。當我們嘗試打開一個數據庫時,系統會檢查當前是否存在該數據庫:

如果數據庫不存在,IndexedDB 會自動創建一個新的數據庫,并將其版本號初始化為 1。

如果數據庫已存在,則會根據傳入的版本號與當前保存的版本號進行比較:

  • 如果傳入的版本號比當前版本更高,IndexedDB 會觸發upgradeneeded事件,此時開發者可以在事件回調中執行數據庫的更新操作(例如創建、修改或刪除對象存儲表)。
  • 傳入的版本號不能低于當前版本號,因為 IndexedDB 的版本號是單向遞增的,不允許回退到舊版本。

注意,這里的版本號是一個整數。如果你傳入一個float,那么將會對該float進行取整操作。


2.3. 創建一個對象存儲表

當創建一個新的數據庫或對現有數據庫進行版本升級時,IndexedDB 會觸發一個 onupgradeneeded 事件。在該事件中,通過訪問 event.target.result,我們可以獲取到 IDBDatabase 實例。借助這個實例,開發者可以執行諸如創建、修改或刪除對象存儲表等數據庫升級操作,從而完成數據庫結構的更新。

其基本使用方式如下所示:

在這里插入圖片描述

創建成功后,就可以在控制臺中查看到創建的存儲空間

在這里插入圖片描述


createObjectStore 參數

  1. name:第一個參數, 表示儲存表的名稱
  2. keyOptions: 第二個參數(可選參數), 是配置對象,
  • keyPath: 儲存數據的標識符
  • autoIncrement:默認為false,若為true,則會自動在儲存的對象上添加標識符屬性,并附上一個自增的正數值(1,2,3,4…)

3. IndexedDB 核心操作

3.1. 開啟事務獲取存儲對象

indexedDB的所有操作都需要在事務中,我們看一個開啟事務的操作:

在這里插入圖片描述


在 IndexedDB 中,`transaction` 方法用于創建一個事務對象,以便對指定的存儲對象進行操作。`transaction`方法接收兩個參數:
  1. 第一個參數是一個數組,數組中包含此事務將會處理的存儲對象名稱;
  2. 第二個參數是事務的處理模式,比如 readonlyreadwrite,分別表示只讀和讀寫模式。

一旦事務創建成功,我們可以監聽事務的 completeerror 事件,以處理事務完成或出錯的情況。接下來,我們可以通過事務對象對指定的 myObjectStore 執行操作


在操作數據之前,咱們得先通過事務調用 objectStore 方法,拿到要操作的存儲對象。這個方法會返回一個 IDBDatabase 類型的存儲對象實例。有了這個實例,咱們就可以調用它的各種方法來操作數據了。

在這里插入圖片描述

通過輸出的存儲對象實例,我們可以直接查看其提供的各種操作方法,從而通過這些方法操作存儲數據。

在這里插入圖片描述


3.2. 添加數據

獲取到存儲對象后, 就可以調用它提供的 add 方法來新增數據。

添加數據示例:
在這里插入圖片描述

數據添加成功后,你可以去查看數據表里的內容。這時候你會發現,數據里多了一個 id 屬性,這就是這條數據的唯一標識符。這是因為前面咱們設置了自動生成 id 的功能。如果沒設置的話,那就得手動給數據添加一個 id 屬性了。但要注意,id 的值必須唯一,不能和其他數據重復,不然添加就會失敗。

在這里插入圖片描述


3.3. 更新數據

要更新數據,可以使用put()方法。使用 put 方法更新數據時,如果數據不存在則會添加。

在這里插入圖片描述


3.4. 查詢數據

通過 get 方法或游標查詢數據。調用get方法需要傳入主鍵id

在這里插入圖片描述


3.5. 刪除數據

通過delete方法刪除單個條目或者clear 方法刪除整個對象。

使用 delete 方法刪除數據時, 需要傳入主鍵, 根據主鍵刪除。

在這里插入圖片描述



總結

本文全面介紹了 IndexedDB 的核心概念和使用方法,包括數據庫的創建與升級、對象存儲表的構建、數據的增刪改查以及事務管理。通過詳細的代碼示例和清晰的步驟說明,讀者可以快速上手并靈活應用 IndexedDB,滿足復雜 Web 應用對本地存儲的需求。無論是離線應用開發還是大容量數據管理,IndexedDB 都能成為你的得力助手。

如果覺得本文對你有幫助,希望能夠給我點贊支持一下哦 💪 也可以關注wx公眾號:程序員付杰 ,一起學習編程技能

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92824.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92824.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92824.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kubernetes深度解析:企業級容器編排平臺的核心實踐

引言:Kubernetes的戰略地位與核心價值在云原生技術生態中,??Kubernetes??已成為容器編排的事實標準。根據2023年全球云原生調查報告:全球??96%?? 的組織正在使用或評估Kubernetes企業生產環境Kubernetes采用率增長??400%??&#…

Netty中future和promise用法和區別

定義與概念 Future:表示一個異步操作的結果。它是只讀的,意味著你只能查看操作是否完成、是否成功、獲取結果或者異常等信息,但不能主動設置操作的結果。Promise:是 Future 的可寫擴展。它不僅可以像 Future 一樣查看操作結果&…

微算法科技(NASDAQ:MLGO)采用分布式哈希表優化區塊鏈索引結構,提高區塊鏈檢索效率

隨著區塊鏈技術的快速發展,其在各個領域的應用越來越廣泛。然而,區塊鏈數據的存儲和檢索效率問題一直是制約其發展的瓶頸之一。為了解決這一問題,微算法科技(NASDAQ:MLGO)采用了分布式哈希表(DHT)技術來優化…

Jmeter的元件使用介紹:(三)配置元件詳解01

Jmeter的配置元件有非常多,常用的有:信息頭管理器、Cookie管理器、用戶定義的變量、Http請求默認值、JDBC Connection Configuration、CSV 數據文件設置、計數器等,本文會對這些常用的配置元件一一介紹,還有其他很多配置元件&…

git 連接GitHub倉庫

一、安裝 git 包在官網下載 git 包二、通過SSH密鑰與GitHub遠程倉庫連接1. 檢查本地 SSH 密鑰是否存在ls -al ~/.ssh如果看到 id_rsa 和 id_rsa.pub,說明已有密鑰。2.如果沒有,生成新的 SSH 密鑰:ssh-keygen -t ed25519 -C "your_email…

如何通過AI掃描代碼中的問題

代碼質量其實在需求高壓,業務快速迭代的場景下往往容易被人忽視的問題,大家的編碼習慣和規范也經常會各有喜好,短期之內獲取看不出來什么問題,但長此以往就會發現,屎山逐步成型了,而線上代碼跑著往往就不想…

Java 大視界 -- Java 大數據機器學習模型在金融衍生品市場波動特征挖掘與交易策略創新中的應用(363)

Java 大視界 -- Java 大數據機器學習模型在金融衍生品市場波動特征挖掘與交易策略創新中的應用(363)引言:正文:一、Java 構建的金融數據處理架構1.1 多源異構數據實時融合1.2 新聞輿情與市場沖擊建模二、Java 驅動的波動特征挖掘與…

Cartographer安裝測試與模塊開發(三)--Cartographer在Gazebo仿真環境下的建圖以及建圖與定位階段問題(實車也可參考)

參數介紹之所以要首先介紹參數而不是實操,是因為大部分建圖失敗、漂移基本上都是參數設置錯誤引起的,或者說大部分都是TF存在問題,主要是坐標系Frame之間有沖突或者對不上等原因導致的,因此把參數放在前面介紹,了解了參…

uniapp nvue開發App 橫豎屏切換丟失上下文導致 setTimeout和clearTimeout報錯

報錯內容如下 [JS Framework] Failed to find taskCenter (35). [JS Framework] Failed to execute the callback function:TypeError: c.clearTimeout is not a function reportJSException >>>> exception function:__WEEX_CALL_JAVASCRIPT__, exception:JavaSc…

Mirauge3D 賦能:全自動建模,讓城市規劃與建筑設計擁有高分辨率實景三維模型

在數字化浪潮席卷各行各業的當下,高精度、多元化的空間數據已成為基礎測繪、智慧城市建設、自然資源管理等領域高質量發展的核心支撐。從城市交通網絡的智能規劃到國土空間的優化配置,從災害監測的精準預警到生態環境保護的科學決策,空間數據…

Javaweb————學習javaweb的預備知識

??????一.javase,javaweb,javaee的區別和聯系 💙💙💙javase: 通俗的來講就是java技術棧,做java相關開發的基礎,比如javaweb,javaee開發都是必備javase的基礎的,包括java語言基礎&#xff…

zabbix服務自動發現、自動注冊及配置釘釘告警(小白的“升級打怪”成長之路)

目錄 一、自動發現及自動注冊 1、自動發現 2、自動注冊規則 二、監控告警并發送電子郵件 1、設定發郵件的地址 2、設定發郵件的用戶 3、設定監控及觸發的條件 4、開始告警并設置觸發發郵件 三、釘釘告警 1、配置zabbix-server 2、配置監控及觸發 3、web頁面操作 4、…

OSPF多區域

OSPF多區域劃分的必要性 OSPF單區域存在的問題 LSDB 龐大,占用內存大,SPF計算開銷大。 LSA洪泛范圍大,拓撲變化影響范圍大。 路由不能被匯總,路由表龐大,查找路由開銷大 解決辦法 劃分區域可以解決上述問題 每個區域獨…

質數、因數、最大公約數經典問題整理

1、計數質數 MX 5000000 is_prime [1] * MX is_prime[0] is_prime[1] 0 for i in range(2, MX):if is_prime[i]:for j in range(i * i, MX, i):is_prime[j] 0class Solution:def countPrimes(self, n: int) -> int:return sum(is_prime[:n]) 2、序列中不同最大公約數的…

Java NIO FileChannel在大文件傳輸中的性能優化實踐指南

Java NIO FileChannel在大文件傳輸中的性能優化實踐指南 在現代分布式系統中,海量數據的存儲與傳輸成為常見需求。Java NIO引入的FileChannel提供了高效的文件讀寫能力,尤其適合大文件傳輸場景。本文從原理深度解析出發,結合生產環境實戰經驗…

SQLite Insert 語句詳解

SQLite Insert 語句詳解 SQLite 是一種輕量級的數據庫管理系統,它以其簡潔的設計、強大的功能和易于使用而聞名。在 SQLite 中,INSERT 語句用于向數據庫表中添加新數據。本文將詳細介紹 SQLite 的 INSERT 語句,包括其基本語法、使用方法以及一些高級特性。 基本語法 SQLi…

git更新內核補丁完整指南

Git操作完整指南 ?? 目錄 項目概述 Git基礎配置 日常操作流程 補丁更新操作 分支管理 沖突解決 常見問題 最佳實踐 命令速查表 ?? 項目概述 </

關于回歸決策樹CART生成算法中的最優化算法詳解

首先&#xff0c;一共比如有M個特征&#xff0c;N個樣本&#xff0c;對于每一個特征j&#xff0c;遍歷其中的N個樣本&#xff0c;得到N個值中&#xff0c;最小的值&#xff0c;作為這個特征的最優切分點&#xff0c;而其中的c1&#xff0c;c2是可以直接得到的。然后&#xff0c…

Ubuntu 環境下創建并啟動一個 MediaMTX 的 systemd 服務

文章目錄一、簡介二、安裝及使用三、創建系統服務小結一、簡介 MediaMTX 是一個現代、高性能、跨平臺的 流媒體服務器&#xff0c;主要用于接收、轉發、轉碼和分發 音視頻流&#xff0c;支持多種協議。它的前身是 rtsp-simple-server&#xff0c;后來重命名為 MediaMTX&#x…

在React中,函數式組件和類組件各有優缺點

函數式組件&#xff1a;無this&#xff0c;無生命周期&#xff0c;配合使用useEffect&#xff0c; 可使用Hooks。 類組件&#xff1a;有生命周期&#xff0c;狀態管理&#xff0c;無Hooks&#xff0c;適用于需要明確生命周期方法和實例方法的場景。 函數式組件 優點&#xff1a…