上一篇
html本地存储之数据库
- 行业动态
- 2025-05-01
- 2
HTML本地存储通过LocalStorage/IndexedDB实现客户端数据持久化,前者以键值对存轻量数据,后者为结构化数据库,均依赖浏览器存储机制,无需服务器交互,适用于离线场景及前端数据缓存
HTML本地存储之数据库(IndexedDB)
什么是IndexedDB?
IndexedDB 是浏览器提供的原生数据库解决方案,用于在客户端存储大量结构化数据,它支持事务、索引、游标等特性,类似于传统关系型数据库(如 SQLite),但基于 JavaScript API 操作。
IndexedDB 与其他本地存储的对比
特性 | IndexedDB | localStorage/sessionStorage | Cookies |
---|---|---|---|
数据容量 | 无限制(通常几百MB~数GB) | 约5~10MB | 约4KB |
数据结构 | 结构化(支持对象、数组等) | 键值对(字符串) | 键值对(字符串) |
API 复杂度 | 复杂(异步操作,需处理事务) | 简单(同步 API) | 简单(同步 API) |
持久化 | 长期存储(除非手动删除) | 长期存储(除非手动删除) | 会话或长期(可设置) |
适用场景 | 复杂数据存储、离线应用 | 简单配置、临时数据 | 用户状态跟踪 |
IndexedDB 的核心特性
- 异步操作:通过
request
对象回调处理结果,避免阻塞主线程。 - 事务支持:支持
readonly
和readwrite
事务,保证数据一致性。 - 索引机制:可为对象属性创建索引(如唯一索引、键范围查询)。
- 结构化克隆算法:支持存储复杂数据类型(如
Date
、Array
、Object
)。 - 浏览器兼容性:现代浏览器均支持,IE10+ 及以上版本兼容。
基本操作步骤
(1) 打开数据库
const request = indexedDB.open('myDatabase', 1); request.onerror = (event) => { console.error('数据库打开失败:', event.target.error); }; request.onsuccess = (event) => { const db = event.target.result; // 获取数据库实例 console.log('数据库打开成功:', db); }; request.onupgradeneeded = (event) => { const db = event.target.result; // 创建对象仓库(表) const objectStore = db.createObjectStore('users', { keyPath: 'id' }); // 创建索引 objectStore.createIndex('name', 'name', { unique: false }); };
(2) 添加数据
const transaction = db.transaction(['users'], 'readwrite'); const objectStore = transaction.objectStore('users'); const data = { id: 1, name: 'Alice', age: 25 }; objectStore.add(data); transaction.oncomplete = () => { console.log('数据添加成功'); }; transaction.onerror = (event) => { console.error('数据添加失败:', event.target.error); };
(3) 查询数据
const transaction = db.transaction(['users']); const objectStore = transaction.objectStore('users'); const request = objectStore.get(1); // 根据主键查询 request.onsuccess = (event) => { console.log('查询结果:', event.target.result); };
典型应用场景
- 离线应用:配合 Service Worker 实现 PWA(渐进式网页应用),如在线文档编辑(Google Docs)、邮件客户端。
- 大数据存储:替代
localStorage
,存储 JSON 数据集、日志文件等。 - 复杂查询需求:通过索引快速检索特定条件的数据(如时间范围、分类筛选)。
注意事项
- 版本控制:数据库版本号(
version
)变更时触发onupgradeneeded
,用于修改对象仓库结构。 - 浏览器差异:部分老旧浏览器需使用 polyfill(如
idb
库)。 - 性能优化:批量操作建议使用事务包裹,减少 I/O 次数。
相关问题与解答
问题1:IndexedDB 和 localStorage 的主要区别是什么?
解答:
- 数据容量:IndexedDB 无限制,localStorage 仅 5~10MB。
- 数据类型:IndexedDB 支持复杂数据结构(如对象、二进制),localStorage 仅支持字符串。
- API 复杂度:IndexedDB 需处理异步事务和游标,localStorage 是简单的同步 API。
- 适用场景:IndexedDB 适合大规模、结构化数据存储,localStorage 适合简单键值对。
问题2:如何确保 IndexedDB 数据与服务器同步?
解答:
- 冲突检测:在离线期间记录操作(如使用
IndexedDB
存储待同步数据),重新联网后与服务器对比。 - 乐观同步:假设操作成功,若服务器返回冲突错误,则提示用户手动解决。
- 版本控制:为每条数据添加版本号或时间戳,覆盖时优先保留最新修改。
- 使用库:借助
Dexie.js
、`idb