瀏覽器存儲 IndexedDB

IndexedDB

1. 什么是 IndexedDB?

IndexedDB 是一種 基于瀏覽器的 NoSQL 數據庫,用于存儲大量的結構化數據,包括文件和二進制數據。它比 localStoragesessionStorage 更強大,支持索引查詢、事務等特性。

IndexedDB 主要特點

  • 持久存儲:數據存儲在用戶設備上,刷新頁面不會丟失。
  • 鍵值對存儲:數據存儲在對象存儲(Object Store)中,使用鍵值對(Key-Value)方式存取。
  • 異步 API:IndexedDB 使用 異步操作,不會阻塞主線程。
  • 事務管理:支持事務,保證數據一致性。
  • 索引支持:允許創建索引,加快查詢速度。
  • 可存儲大數據:可以存儲比 localStorage 多得多的數據,可以存儲結構化克隆算法支持的任何對象,文件/二進制大型對象(blobs)。

2. IndexedDB 核心 API

2.1 數據庫管理(Database Management)

IndexedDB 允許創建、打開、升級和刪除數據庫。
獲取所有數據庫列表
在這里插入圖片描述
刪除指定數據庫
在這里插入圖片描述

打開或創建數據庫
const request = indexedDB.open("MyDatabase", 1);
  • MyDatabase:數據庫名稱。
  • 1:數據庫版本號(升級數據庫時需要增加版本號)。
    在這里插入圖片描述
數據庫打開成功事件
request.onsuccess = function(event) {const db = event.target.result;console.log("數據庫打開成功", db);
};
數據庫升級(創建表)
request.onupgradeneeded = function(event) {const db = event.target.result;if (!db.objectStoreNames.contains("users")) {db.createObjectStore("users", { keyPath: "id", autoIncrement: true });}
};
//改事件會在數據庫第一次創建以及版本號變更時觸發.并且版本號只能遞增只能說整數.
  • keyPath: "id":指定主鍵。名字隨便
  • autoIncrement: true:自動遞增 ID。
數據庫打開失敗事件
request.onerror = function(event) {console.error("數據庫打開失敗", event.target.errorCode);
};
刪除數據庫
indexedDB.deleteDatabase("MyDatabase").onsuccess = function() {console.log("數據庫刪除成功");
};

注意事項

  • 數據庫的版本號只能 遞增,不能降級。
  • 不能在 onsuccess 事件中直接修改數據庫結構,需要在 onupgradeneeded 事件中完成。

2.2 事務管理(Transactions)

所有數據庫操作必須在 事務 中完成。

const transaction = db.transaction(["users"], "readwrite");
const store = transaction.objectStore("users");
  • "readonly":只讀事務。
  • "readwrite":可讀寫事務。
  • "versionchange":用于數據庫升級。

事務事件監聽

transaction.oncomplete = function() {console.log("事務完成");
};
transaction.onerror = function() {console.log("事務出錯", transaction.error);
};
transaction.onabort = function() {console.log("事務被中止");
};

注意事項

  • 事務默認是 自動提交 的,一旦事務完成,不能再操作它。
  • 如果某個操作失敗,整個事務都會回滾。

2.3 對象存儲(Object Store)

IndexedDB 的數據存儲在 對象存儲(Object Store) 中,類似于數據庫中的表。

添加數據
store.add({ id: 1, name: "Alice", age: 25 });
更新數據
store.put({ id: 1, name: "Alice", age: 26 });
獲取數據
const request = store.get(1);
request.onsuccess = function() {console.log("用戶數據:", request.result);
};
獲取所有數據
const allRequest = store.getAll();
allRequest.onsuccess = function() {console.log("所有用戶數據:", allRequest.result);
};
刪除數據
store.delete(1);
清空表數據
store.clear();

2.4 索引(Indexes)

索引用于提高查詢性能。

創建索引
store.createIndex("nameIndex", "name", { unique: false });
通過索引查詢數據
const index = store.index("nameIndex");
const request = index.get("Alice");
request.onsuccess = function() {console.log("查詢結果:", request.result);
};

注意事項

  • unique: true 表示索引字段值不能重復。

2.5 游標(Cursors)

用于遍歷數據。

const cursorRequest = store.openCursor();
//openCursor()接受兩個可選參數
//要查詢的鍵或者 IDBKeyRange 。如果傳一個有效的鍵,則會默認為只包含此鍵的范圍。如果此參數不傳值,則默認為一個選擇了該對象存儲空間全部記錄的鍵范圍。
//direction  IDBCursorDirection 來告訴游標要移動的方向。
//有效的值有 "next" 、"nextunique" 、"prev" 和 "prevunique"。默認值是 "next"。
cursorRequest.onsuccess = function(event) {const cursor = event.target.result;if (cursor) {console.log("遍歷數據:", cursor.value);cursor.continue();}
};

在這里插入圖片描述

let keyRangeValue = IDBKeyRange.bound(2,6);store.openCursor(keyRangeValue)//查詢id 2~6的

在這里插入圖片描述

在這里插入圖片描述

// 倒著查詢
let keyRangeValue = IDBKeyRange.upperBound(5);
store.openCursor(keyRangeValue,'prev')

在這里插入圖片描述

查詢條件代碼
所有鍵 ≤ xIDBKeyRange.upperBound(x)
所有鍵 < xIDBKeyRange.upperBound(x, true)
所有鍵 ≥ yIDBKeyRange.lowerBound(y)
所有鍵 > yIDBKeyRange.lowerBound(y, true)
所有鍵 ≥ x 且 ≤ yIDBKeyRange.bound(x, y)
所有鍵 > x 且 < yIDBKeyRange.bound(x, y, true, true)
所有鍵 > x 且 ≤ yIDBKeyRange.bound(x, y, true, false)
所有鍵 ≥ x 且 < yIDBKeyRange.bound(x, y, false, true)
鍵值等于 zIDBKeyRange.only(z)

注意事項

  • cursor.continue() 讓游標指向下一個數據。
  • cursor.delete() 可刪除當前項。

3. IndexedDB 完整示例

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>IndexedDB 示例</title>
</head><body><script>let arr = Array(10).fill(0).map((_, i) => ({ id: i, name: `用戶${i}`, age: 20 + i }));const request = indexedDB.open("demo", 1);let db;request.onupgradeneeded = function (e) {db = e.target.result;console.log("數據庫升級:", db);if (!db.objectStoreNames.contains("users")) {db.createObjectStore("users", { keyPath: "id", autoIncrement: true });console.log("對象存儲 'users' 創建成功");}};request.onsuccess = function (e) {db = e.target.result;const transaction = db.transaction("users", "readwrite");const store = transaction.objectStore("users");arr.forEach(item => {store.add(item);});store.getAll().onsuccess = function (e) {console.log("所有數據:", e.target.result);};var keyRangeValue = IDBKeyRange.upperBound(5);store.openCursor(keyRangeValue, 'prev').onsuccess = function (e) {const cursor = e.target.result;if (cursor) {console.log("游標數據:", cursor.value);cursor.continue();}};};request.onerror = function (e) {console.error("數據庫打開失敗", e.target.error);};request.onblocked = function () {console.warn("數據庫升級被阻塞,請關閉其他頁面");};</script>
</body></html>

IndexedDB 提供了一系列 API 來管理數據庫、存儲對象和執行事務,以下是 IndexedDB 的所有主要 API,按照功能分類列出:


1. 數據庫管理(Database Management)

這些 API 負責打開、創建和刪除數據庫:

API作用
indexedDB.open(name, version)打開數據庫,如果不存在則創建
indexedDB.deleteDatabase(name)刪除數據庫
indexedDB.databases()獲取所有已創建的數據庫(僅部分瀏覽器支持)
IDBOpenDBRequest.onsuccess數據庫打開成功的事件
IDBOpenDBRequest.onerror數據庫打開失敗的事件
IDBOpenDBRequest.onupgradeneeded數據庫版本變更時觸發(用于初始化或升級數據庫)

2. 事務(Transactions)

IndexedDB 使用事務來確保數據一致性:

API作用
db.transaction(storeNames, mode)創建事務,mode 可以是 "readonly""readwrite"
IDBTransaction.objectStore(name)獲取對象存儲(表)
IDBTransaction.oncomplete事務成功完成時觸發
IDBTransaction.onerror事務出錯時觸發
IDBTransaction.onabort事務被中止時觸發

3. 對象存儲(Object Store)

IndexedDB 中的數據存儲在對象存儲(類似數據庫中的表)中:

API作用
db.createObjectStore(name, options)創建對象存儲,options 可設置 keyPath
IDBDatabase.deleteObjectStore(name)刪除對象存儲
IDBObjectStore.add(value, key?)添加數據(如果 keyPath 沒有設置 key,可以傳 key
IDBObjectStore.put(value, key?)更新數據(如果 key 已存在)
IDBObjectStore.get(key)獲取指定 key 的數據
IDBObjectStore.getAll()獲取所有數據(部分瀏覽器不支持)
IDBObjectStore.getAllKeys()獲取所有 key(部分瀏覽器不支持)
IDBObjectStore.delete(key)刪除指定 key 的數據
IDBObjectStore.clear()清空整個對象存儲
IDBObjectStore.createIndex(name, keyPath, options)創建索引
IDBObjectStore.index(name)獲取索引

4. 索引(Indexes)

索引用于加速查詢:

API作用
IDBIndex.get(key)通過索引查找數據
IDBIndex.getAll()獲取所有索引匹配的數據
IDBIndex.getAllKeys()獲取所有索引的 key
IDBIndex.count()統計匹配索引的數據條數
IDBIndex.openCursor()通過索引游標遍歷數據

5. 游標(Cursors)

游標用于遍歷大數據集:

API作用
IDBObjectStore.openCursor()遍歷對象存儲
IDBIndex.openCursor()通過索引遍歷數據
IDBCursor.continue()繼續下一個數據項
IDBCursor.advance(n)跳過 n 個數據項
IDBCursor.delete()刪除當前游標指向的數據
IDBCursor.update(value)更新當前游標指向的數據

6. 事件(Events)

IndexedDB 主要是基于事件的,以下是常見事件:

事件觸發時機
onupgradeneeded數據庫版本更新時
onsuccess操作成功時
onerror操作失敗時
oncomplete事務完成時
onabort事務中止時

7. 其他 API

一些輔助 API:

API作用
IDBFactory.cmp(key1, key2)比較兩個鍵的大小
IDBObjectStore.count()統計對象存儲中的數據條數

總結

IndexedDB 提供了一整套 API 來管理數據庫、對象存儲、索引和事務,核心 API 主要包括:

  1. 數據庫管理indexedDB.open()indexedDB.deleteDatabase()
  2. 事務transaction()objectStore()
  3. 對象存儲操作add()put()get()delete()
  4. 索引createIndex()get()openCursor()
  5. 游標openCursor()continue()advance()
  6. 事件onsuccessonerroronupgradeneeded

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

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

相關文章

panda3d 渲染

目錄 安裝 設置渲染寬高&#xff1a; 渲染3d 安裝 pip install Panda3D 設置渲染寬高&#xff1a; import panda3d.core as pdmargin 100 screen Tk().winfo_screenwidth() - margin, Tk().winfo_screenheight() - margin width, height (screen[0], int(screen[0] / 1…

Node.js 包管理工具 - NPM 與 PNPM 清理緩存

NPM 清理緩存 1、基本介紹 npm 緩存是 npm 用來存儲已下載包的地方&#xff0c;以加快后續安裝速度 但是&#xff0c;有時緩存可能會損壞或占用過多磁盤空間&#xff0c;這時可以清理 npm 緩存 2、清理操作 執行如下指令&#xff0c;清理 npm 緩存 npm cache clean --for…

STM32F103_LL庫+寄存器學習筆記05 - GPIO輸入模式,捕獲上升沿進入中斷回調

導言 GPIO設置輸入模式后&#xff0c;一般會用輪詢的方式去查看GPIO的電平狀態。比如&#xff0c;最常用的案例是用于檢測按鈕的當前狀態&#xff08;是按下還是沒按下&#xff09;。中斷的使用一般用于計算脈沖的頻率與計算脈沖的數量。 項目地址&#xff1a;https://github.…

【C++進階二】string的模擬實現

【C進階二】string的模擬實現 1.構造函數和C_strC_str: 2.operator[]3.拷貝構造3.1淺拷貝3.2深拷貝 4.賦值5.迭代器6.比較ascll碼值的大小7.reverse擴容8.push_back尾插和append尾插9.10.insert10.1在pos位置前插入字符ch10.2在pos位置前插入字符串str 11.resize12.erase12.1從…

wokwi arduino mega 2560 - 點亮LED案例

截圖&#xff1a; 點亮LED案例仿真截圖 代碼&#xff1a; unsigned long t[20]; // 定義一個數組t&#xff0c;用于存儲20個LED的上次狀態切換時間&#xff08;單位&#xff1a;毫秒&#xff09;void setup() {pinMode(13, OUTPUT); // 將引腳13設置為輸出模式&#xff08;此…

vue3項目使用 python +flask 打包成桌面應用

server.py import os import sys from flask import Flask, send_from_directory# 獲取靜態文件路徑 if getattr(sys, "frozen", False):# 如果是打包后的可執行文件base_dir sys._MEIPASS else:# 如果是開發環境base_dir os.path.dirname(os.path.abspath(__file…

后端學習day1-Spring(八股)--還剩9個沒看

一、Spring 1.請你說說Spring的核心是什么 參考答案 Spring框架包含眾多模塊&#xff0c;如Core、Testing、Data Access、Web Servlet等&#xff0c;其中Core是整個Spring框架的核心模塊。Core模塊提供了IoC容器、AOP功能、數據綁定、類型轉換等一系列的基礎功能&#xff0c;…

LeetCode 第34、35題

LeetCode 第34題&#xff1a;在排序數組中查找元素的第一個和最后一個位置 題目描述 給你一個按照非遞減順序排列的整數數組nums&#xff0c;和一個目標值target。請你找出給定目標值在數組中的開始位置和結束位置。如果數組中不存在目標值target&#xff0c;返回[-1,1]。你必須…

告別分庫分表,時序數據庫 TDengine 解鎖燃氣監控新可能

達成效果&#xff1a; 從 MySQL 遷移至 TDengine 后&#xff0c;設備數據自動分片&#xff0c;運維更簡單。 列式存儲可減少 50% 的存儲占用&#xff0c;單服務器即可支撐全量業務。 毫秒級漏氣報警響應時間控制在 500ms 以內&#xff0c;提升應急管理效率。 新架構支持未來…

第十四屆藍橋杯真題

一.LED 先配置LED的八個引腳為GPIO_OutPut,鎖存器PD2也是,然后都設置為起始高電平,生成代碼時還要去解決引腳沖突問題 二.按鍵 按鍵配置,由原理圖按鍵所對引腳要GPIO_Input 生成代碼,在文件夾中添加code文件夾,code中添加fun.c、fun.h、headfile.h文件,去資源包中把lc…

《基于機器學習發電數據電量預測》開題報告

個人主頁&#xff1a;大數據蟒行探索者 目錄 一、選題背景、研究意義及文獻綜述 &#xff08;一&#xff09;選題背景 &#xff08;二&#xff09;選題意義 &#xff08;三&#xff09;文獻綜述 1. 國內外研究現狀 2. 未來方向展望 二、研究的基本內容&#xff0c;擬解…

UWP程序用多頁面實現應用實例多開

Windows 10 IoT ARM64平臺下&#xff0c;UWP應用和MFC程序不一樣&#xff0c;同時只能打開一個應用實例。以串口程序為例&#xff0c;如果用戶希望同時打開多個應用實例&#xff0c;一個應用實例打開串口1&#xff0c;一個應用實例打開串口2&#xff0c;那么我們可以加載多個頁…

Springboot整合Netty簡單實現1對1聊天(vx小程序服務端)

本文功能實現較為簡陋&#xff0c;demo內容僅供參考&#xff0c;有不足之處還請指正。 背景 一個小項目&#xff0c;用于微信小程序的服務端&#xff0c;需要實現小程序端可以和他人1對1聊天 實現功能 Websocket、心跳檢測、消息持久化、離線消息存儲 Netty配置類 /*** au…

GitLab 中文版17.10正式發布,27項重點功能解讀【二】

GitLab 是一個全球知名的一體化 DevOps 平臺&#xff0c;很多人都通過私有化部署 GitLab 來進行源代碼托管。極狐GitLab 是 GitLab 在中國的發行版&#xff0c;專門為中國程序員服務。可以一鍵式部署極狐GitLab。 學習極狐GitLab 的相關資料&#xff1a; 極狐GitLab 官網極狐…

好消息!軟航文檔控件(NTKO WebOffice)在Chrome 133版本上提示擴展已停用的解決方案

軟航文檔控件現有版本依賴Manifest V2擴展技術支持才能正常運行&#xff0c;然而這個擴展技術到2025年6月在Chrome高版本上就徹底不支持了&#xff0c;現在Chrome 133開始的版本已經開始彈出警告&#xff0c;必須手工開啟擴展支持才能正常運行。那么如何解決這個技術難題呢&…

字典樹與01trie

字典樹簡介 當我們通過字典查一個字或單詞的時候&#xff0c;我們會通過前綴或關鍵字的來快速定位一個字的位置&#xff0c;進行快速查找。 字典樹就是類似字典中索引表的一種數據結構&#xff0c;能夠幫助我們快速定位一個字符串的位置。 字典樹是一種存儲字符串的數據結構…

二十五、實戰開發 uni-app x 項目(仿京東)- 前后端輪播圖

定義了一個名為 Swiper 的Java類,用于表示一個輪播圖實體。它使用了 Jakarta Persistence API (JPA) 來映射數據庫表,并使用了 Lombok 庫來簡化代碼。以下是對代碼的詳細講解: 1. 包聲明 package com.jd.jdmall.model; 這行代碼聲明了該類所在的包路徑為 com.jd.jdmall.mode…

游戲搖桿開發:利用 Windows API 實現搖桿輸入捕獲

在現代游戲開發中&#xff0c;游戲搖桿&#xff08;Joystick&#xff09;作為一種重要的輸入設備&#xff0c;能夠為玩家提供更加沉浸式的游戲體驗。Windows 操作系統提供了一系列 API 函數&#xff0c;允許開發者輕松地捕獲和處理游戲搖桿的輸入。本文將介紹如何使用 Windows …

Ceph集群2025(Squid版)快速對接K8S cephFS文件存儲

ceph的塊存儲太簡單了。所以不做演示 查看集群 創建一個 CephFS 文件系統 # ceph fs volume create cephfs01 需要創建一個子卷# ceph fs subvolume create cephfs01 my-subvol -----------------#以下全部自動創建好 # ceph fs ls name: cephfs01, metadata pool: c…

Python中數據結構元組詳解

在Python中&#xff0c;元組&#xff08;Tuple&#xff09;是一種不可變的序列類型&#xff0c;常用于存儲一組有序的數據。與列表&#xff08;List&#xff09;不同&#xff0c;元組一旦創建&#xff0c;其內容無法修改。本文將詳細介紹元組的基本操作、常見運算、內置函數以及…