【IndexDB】前端IndexedDB終極指南

前端 IndexedDB 詳細教程

IndexedDB 是一個瀏覽器內置的 NoSQL 數據庫系統,允許在客戶端存儲大量結構化數據,并支持高性能搜索。相比 localStorage,IndexedDB 更適合存儲大量數據并提供更復雜的查詢功能。

基本概念

  1. 數據庫:每個源(協議+域名+端口)可以創建多個數據庫
  2. 對象存儲(Object Store):類似于數據庫中的表
  3. 索引(Index):用于快速查找數據
  4. 事務(Transaction):所有操作必須在事務中執行
  5. 游標(Cursor):用于遍歷對象存儲中的數據

打開/創建數據庫

const request = indexedDB.open('myDatabase', 1);request.onerror = function(event) {console.error("數據庫打開失敗:", event.target.error);
};request.onsuccess = function(event) {const db = event.target.result;console.log("數據庫打開成功");// 在這里執行數據庫操作
};request.onupgradeneeded = function(event) {const db = event.target.result;// 創建對象存儲和索引if (!db.objectStoreNames.contains('customers')) {const store = db.createObjectStore('customers', { keyPath: 'id' });// 創建索引store.createIndex('name', 'name', { unique: false });store.createIndex('email', 'email', { unique: true });}
};

添加數據

function addCustomer(db, customer) {const transaction = db.transaction(['customers'], 'readwrite');const store = transaction.objectStore('customers');const request = store.add(customer);request.onsuccess = function() {console.log('數據添加成功');};request.onerror = function(event) {console.error('數據添加失敗:', event.target.error);};
}// 使用示例
const db = /* 獲取數據庫實例 */;
addCustomer(db, {id: 1,name: '張三',email: 'zhangsan@example.com',age: 30
});

讀取數據

通過主鍵讀取

function getCustomer(db, id) {const transaction = db.transaction(['customers'], 'readonly');const store = transaction.objectStore('customers');const request = store.get(id);request.onsuccess = function() {const customer = request.result;if (customer) {console.log('找到客戶:', customer);} else {console.log('未找到客戶');}};request.onerror = function(event) {console.error('讀取數據失敗:', event.target.error);};
}

通過索引讀取

function getCustomerByName(db, name) {const transaction = db.transaction(['customers'], 'readonly');const store = transaction.objectStore('customers');const index = store.index('name');const request = index.get(name);request.onsuccess = function() {const customer = request.result;console.log('找到客戶:', customer);};request.onerror = function(event) {console.error('通過索引查詢失敗:', event.target.error);};
}

更新數據

function updateCustomer(db, customer) {const transaction = db.transaction(['customers'], 'readwrite');const store = transaction.objectStore('customers');const request = store.put(customer);request.onsuccess = function() {console.log('數據更新成功');};request.onerror = function(event) {console.error('數據更新失敗:', event.target.error);};
}

刪除數據

function deleteCustomer(db, id) {const transaction = db.transaction(['customers'], 'readwrite');const store = transaction.objectStore('customers');const request = store.delete(id);request.onsuccess = function() {console.log('數據刪除成功');};request.onerror = function(event) {console.error('數據刪除失敗:', event.target.error);};
}

使用游標遍歷數據

function getAllCustomers(db) {const transaction = db.transaction(['customers'], 'readonly');const store = transaction.objectStore('customers');const request = store.openCursor();const customers = [];request.onsuccess = function(event) {const cursor = event.target.result;if (cursor) {customers.push(cursor.value);cursor.continue();} else {console.log('所有客戶:', customers);}};request.onerror = function(event) {console.error('遍歷數據失敗:', event.target.error);};
}

高級用法

使用索引范圍查詢

function getCustomersByAgeRange(db, min, max) {const transaction = db.transaction(['customers'], 'readonly');const store = transaction.objectStore('customers');// 假設我們創建了age索引const index = store.index('age');const range = IDBKeyRange.bound(min, max);const request = index.openCursor(range);const customers = [];request.onsuccess = function(event) {const cursor = event.target.result;if (cursor) {customers.push(cursor.value);cursor.continue();} else {console.log('年齡范圍內的客戶:', customers);}};
}

批量操作

function addMultipleCustomers(db, customers) {const transaction = db.transaction(['customers'], 'readwrite');const store = transaction.objectStore('customers');customers.forEach(customer => {store.add(customer);});transaction.oncomplete = function() {console.log('批量添加完成');};transaction.onerror = function(event) {console.error('批量操作失敗:', event.target.error);};
}

數據庫版本管理

// 升級數據庫版本
function upgradeDB() {const request = indexedDB.open('myDatabase', 2); // 版本號增加request.onupgradeneeded = function(event) {const db = event.target.result;const oldVersion = event.oldVersion;const newVersion = event.newVersion;// 從版本1升級到版本2if (oldVersion < 1) {// 初始創建邏輯}if (oldVersion < 2) {// 版本2的變更if (!db.objectStoreNames.contains('orders')) {const store = db.createObjectStore('orders', { keyPath: 'orderId' });store.createIndex('customerId', 'customerId', { unique: false });}}};
}

最佳實踐

  1. 錯誤處理:始終處理onerror事件
  2. 事務管理:合理使用事務,避免長時間持有事務
  3. 性能優化:對于大量數據操作,使用游標分批處理
  4. 內存管理:處理完數據后關閉游標和數據庫連接
  5. 兼容性:檢查瀏覽器支持情況
if (!window.indexedDB) {console.error("您的瀏覽器不支持IndexedDB");
}

封裝示例

class IndexedDBWrapper {constructor(dbName, version) {this.dbName = dbName;this.version = version;this.db = null;}open() {return new Promise((resolve, reject) => {const request = indexedDB.open(this.dbName, this.version);request.onerror = (event) => reject(event.target.error);request.onsuccess = (event) => {this.db = event.target.result;resolve(this.db);};request.onupgradeneeded = (event) => {const db = event.target.result;if (!db.objectStoreNames.contains('data')) {const store = db.createObjectStore('data', { keyPath: 'id' });store.createIndex('timestamp', 'timestamp', { unique: false });}};});}add(storeName, data) {return new Promise((resolve, reject) => {const transaction = this.db.transaction([storeName], 'readwrite');const store = transaction.objectStore(storeName);const request = store.add(data);request.onsuccess = () => resolve(request.result);request.onerror = (event) => reject(event.target.error);});}// 其他方法類似封裝...
}// 使用示例
(async function() {const dbWrapper = new IndexedDBWrapper('myAppDB', 1);try {await dbWrapper.open();await dbWrapper.add('data', { id: 1, value: 'test', timestamp: Date.now() });console.log('操作成功');} catch (error) {console.error('操作失敗:', error);}
})();

IndexedDB 提供了強大的客戶端存儲能力,適合需要離線功能或處理大量結構化數據的 Web 應用。通過合理使用,可以顯著提升應用性能和用戶體驗。

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

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

相關文章

擴散模型與強化學習(1):字節Seedance中的人類偏好優化實踐

擴散模型與強化學習(0)&#xff1a;專欄匯總與導航 前言&#xff1a;最近強化學習在Diffusion Models得到了越來越多廣泛的應用&#xff0c;本專欄將系統性地介紹當前Diffusion Models中實用且前沿的技術進展。這篇博客介紹字節最新的視頻生成模型Seedance 1.0: Exploring the …

【內存】Linux 內核優化實戰 - vm.max_map_count

目錄 vm.max_map_count參數全面解析一、參數定義與核心作用二、默認值與關鍵調整場景1. 默認限制與不足場景2. 典型報錯案例 三、操作指南&#xff1a;查看與修改方法四、場景化建議值與配置示例五、關鍵注意事項六、延伸知識&#xff1a;內存映射的底層邏輯 vm.max_map_count參…

組件之間的雙向綁定:v-model

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

GetX 實現 MVVM 架構, 高效 路由管理 和 狀態管理

GetX是Flutter中的一個高效的狀態管理與路由管理框架&#xff0c;結合MVVM架構能簡化代碼邏輯。以下是使用GetX實現MVVM架構&#xff0c;并完成路由和狀態管理的核心思路與實踐&#xff1a; 一、MVVM架構在GetX中的映射 MVVM&#xff08;Model-View-ViewModel&#xff09;與G…

Qt項目,記事本

一、項目說明 項目功能&#xff1a; &#xff08;1&#xff09;打開文件&#xff1a;點擊打開文件按鈕彈出對話框&#xff0c;選擇文本文件后&#xff0c;在主窗口編輯界面顯示內容。 &#xff08;2&#xff09;關閉文件&#xff1a;關閉打開的文件&#xff0c;并詢問是否保存…

【全開源】填表問卷統計預約打卡表單系統+uniapp前端

一.系統介紹 填表問卷統計預約打卡表單系統是ThinkPHPUniApp開發的一款集信息填表、預約報名&#xff0c;簽到打卡、活動通知、報名投票、班級統計等功能的自定義表單統計小程序。 二.搭建環境 系統環境&#xff1a;CentOS、 運行環境&#xff1a;寶塔 Linux 網站環境&…

開源 python 應用 開發(一)python、pip、pyAutogui、python opencv安裝

最近有個項目需要做視覺自動化處理的工具&#xff0c;最后選用的軟件為python&#xff0c;剛好這個機會進行系統學習。短時間學習&#xff0c;需要快速開發&#xff0c;所以記錄要點步驟&#xff0c;防止忘記。 鏈接&#xff1a; 開源 python 應用 開發&#xff08;一&#x…

SpringCloud + Zookeeper + Feign整合及Feign原理

知其然 SpringCloud Zookeeper Spring Cloud 與 Zookeeper的整合只需要添加相關的starter依賴和增加相關注解即可完成。 pom.xml 如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.…

深入探索 OpenCV 圖像識別:從基礎到深度學習

在當今數字化時代&#xff0c;圖像識別技術已經滲透到我們生活的方方面面&#xff0c;從智能手機中的拍照翻譯功能到自動駕駛汽車的目標檢測系統&#xff0c;圖像識別的應用無處不在。作為一名算法工程師&#xff0c;我有幸深入研究并實踐了 OpenCV 在圖像識別領域的強大功能。…

Hadoop部署(HA)高可用集群

一、準備工作 1.把集群全部停掉 在三臺節點上都做&#xff08;在xshell通過右鍵----> 發送輸入到--->所有會話&#xff09; 2..在/export/servers下創建HA目錄 sudo mkdir -p /export/servers/HA 3.創建用戶和設置所屬主和所屬組 #創建用戶 sudo adduser ygre #設置…

STM32 CAN位同步、錯誤處理

一、接收方數據采樣 CAN總線沒有時鐘線&#xff0c;總線上的所有設備通過約定波特率的方式確定每一個數據位的時長發送方以約定的位時長每隔固定時間輸出一個數據位接收方以約定的位時長每隔固定時間采樣總線的電平&#xff0c;輸入一個數據位理想狀態下&#xff0c;接收方能依…

django serializer __all__中 額外添加外鍵里的某一個屬性

在Django中使用序列化器&#xff08;Serializer&#xff09;時&#xff0c;你可能會遇到需要將模型&#xff08;Model&#xff09;中的外鍵字段轉換成其關聯對象的一部分屬性的情況。默認情況下&#xff0c;序列化器會自動序列化外鍵字段&#xff0c;但如果你想要在序列化結果中…

Redis快的原因

Redis 高性能的核心原因 Redis 之所以能達到極高的性能&#xff08;10萬 QPS&#xff09;&#xff0c;主要源于以下幾個關鍵設計&#xff1a; 1. 純內存操作 核心優勢&#xff1a;所有數據存儲在內存中&#xff0c;避免了磁盤 I/O 瓶頸 內存訪問速度比磁盤快 10萬倍以上&am…

【大模型微調】6.模型微調實測與格式轉換導出

引言 本文繼續研究 LLaMA-Factory 微調數據的流程&#xff0c;側重于微調結果與模型導出。 數據集準備 首先參考 LLaMA-Factory 核心開發者的文章[1]&#xff0c;下載用于微調的公開的商品文案數據集 AdvertiseGen。 下載地址&#xff1a;https%3A//cloud.tsinghua.edu.cn/…

3085. 成為 K 特殊字符串需要刪除的最少字符數

3085. 成為 K 特殊字符串需要刪除的最少字符數 給你一個字符串 word 和一個整數 k。 如果 |freq(word[i]) - freq(word[j])| < k 對于字符串中所有下標 i 和 j 都成立&#xff0c;則認為 word 是 k 特殊字符串。 此處&#xff0c;freq(x) 表示字符 x 在 word 中的出現頻…

分布式系統中的 Kafka:流量削峰與異步解耦(二)

Kafka 在分布式系統中的應用案例 電商訂單系統 在電商領域&#xff0c;訂單系統是核心業務模塊之一&#xff0c;涉及多個復雜的業務環節和系統組件之間的交互。以常見的電商購物流程為例&#xff0c;當用戶在電商平臺上下單后&#xff0c;訂單創建服務會首先接收到用戶的訂單…

從事登高架設作業需要注意哪些安全事項?

從事登高架設作業&#xff08;如腳手架搭設、高空維修、外墻清洗等&#xff09;屬于高風險特種作業&#xff0c;必須嚴格遵守安全規范。以下是關鍵安全注意事項&#xff0c;涵蓋作業前準備、作業中操作、應急處理三大環節&#xff0c;符合國家《高處作業安全技術規范》&#xf…

RA4M2開發IOT(6)----涂鴉模組快速上云

RA4M2開發IOT.6--涂鴉模組快速上云 概述視頻教學樣品申請硬件準備參考程序涂鴉官網鏈接創建一個項目選擇對應產品產品基本配置添加標準功能APP界面配置硬件選擇產品配置硬件詳情PCB原理圖涂鴉調試文件下載進入調試涂鴉模塊串口協議心跳檢測查詢產品信息查詢工作模式AP配網APP鏈…

AI時代SEO關鍵詞革新

內容概要 在人工智能&#xff08;AI&#xff09;技術快速發展的背景下&#xff0c;搜索引擎優化&#xff08;SEO&#xff09;關鍵詞策略正經歷根本性變革。本文將系統闡述AI如何重塑關鍵詞研究、優化及效果評估的全流程。具體而言&#xff0c;首先解析智能研究方法在挖掘用戶意…

JavaEE初階第三期:解鎖多線程,從 “單車道” 到 “高速公路” 的編程升級(一)

專欄&#xff1a;JavaEE初階起飛計劃 個人主頁&#xff1a;手握風云 目錄 一、認識線程 1.1. 概念 1.2. 為什么要使用線程 1.3. 進程和線程的關系 1.4. 多線程模型 二、多線程的創建 2.1. 繼承Thread類 2.2. 實現Runnable接口 2.3. 匿名內部類 2.4. lambda表達式 一、…