上一篇
html5共有数据库
- 行业动态
- 2025-05-04
- 2651
HTML5提供本地存储(localStorage/sessionStorage)及IndexedDB数据库,支持键值和对象存储,满足不同
HTML5 IndexedDB 详细说明
基本概念
IndexedDB 是 HTML5 提供的浏览器端数据库解决方案,允许在用户浏览器中存储大量结构化数据(可超过 50MB),它是一个异步、事务型数据库系统,支持索引和复杂查询,适用于离线应用、数据缓存等场景。
核心特点
特性 | 说明 |
---|---|
异步操作 | 通过事件或 Promise 处理结果,避免阻塞主线程。 |
事务支持 | 支持 readonly 和 readwrite 事务,保证数据一致性。 |
键范围查询 | 支持按主键范围(如 > , < , >= )查询数据。 |
索引支持 | 可为非主键字段创建索引,加速查询。 |
存储容量大 | 默认容量上限约 500MB(不同浏览器可能有差异)。 |
持久化 | 数据长期存储,即使关闭页面或浏览器也不会丢失。 |
API 结构
IndexedDB 的操作围绕以下核心对象展开:
IDBDatabase
:数据库实例,包含数据操作方法。IDBObjectStore
:类似表(Table),用于存储数据。IDBTransaction
:事务对象,确保操作的原子性。IDBKeyRange
:定义键范围,用于查询。
操作步骤
打开数据库
const request = indexedDB.open('myDatabase', 1); // 版本号为 1 request.onupgradeneeded = (event) => { const db = event.target.result; const objectStore = db.createObjectStore('users', { keyPath: 'id' }); // 创建存储空间 objectStore.createIndex('name', { unique: false }); // 创建辅助索引 }; request.onsuccess = (event) => { const db = event.target.result; // 后续操作... };
添加数据
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('数据添加成功');
查询数据
const transaction = db.transaction(['users']); const objectStore = transaction.objectStore('users'); const request = objectStore.get(1); // 按主键查询 request.onsuccess = () => console.log(request.result);
删除数据
const transaction = db.transaction(['users'], 'readwrite'); const objectStore = transaction.objectStore('users'); objectStore.delete(1); // 删除主键为 1 的数据
版本升级
当数据库版本号变化时,会自动触发 onupgradeneeded
事件,可通过以下方式迁移数据:
indexedDB.open('myDatabase', 2).onupgradeneeded = (event) => { const db = event.target.result; if (db.oldVersion === 1) { // 迁移逻辑,例如新增字段或索引 const objectStore = db.createObjectStore('users', { keyPath: 'id' }); // 从旧数据复制到新结构... } };
适用场景
场景 | 说明 |
---|---|
离线应用 | 存储完整数据副本,支持无网络访问。 |
数据缓存 | 缓存频繁请求的数据(如 API 响应),减少服务器压力。 |
表单暂存 | 用户输入中途离开时保存草稿。 |
媒体资源管理 | 存储图片、视频等大文件(需结合 Blob 或 File API)。 |
注意事项
- 浏览器兼容性:IE10+ 支持,现代浏览器已全面兼容。
- 存储限制:部分浏览器对单个域名的 IndexedDB 存储有容量限制。
- 数据同步:需自行实现与服务器的数据同步机制。
- 隐私问题:数据存储在本地,需注意敏感信息保护(如加密存储)。
相关问题与解答
问题 1:IndexedDB 和 localStorage 有什么区别?
解答:
| 特性 | IndexedDB | localStorage |
|———————|————————————|——————————|
| 数据容量 | 可存储 GB 级数据(受限于浏览器) | 通常最大 5~10MB |
| 数据类型 | 支持对象、二进制数据(如 ArrayBuffer)| 仅支持字符串 |
| API | 异步操作,支持事务和索引 | 同步 API,操作简单 |
| 用途 | 复杂数据存储、离线应用 | 简单键值对存储(如配置缓存) |
问题 2:如何确保 IndexedDB 数据的实时性(与服务器同步)?
解答:
- 乐观同步:客户端操作后立即更新界面,同时将变更记录发送到服务器,若同步失败,可标记为“待同步”状态。
- 冲突解决:服务器返回最新数据时,对比版本号或时间戳,覆盖或合并客户端数据。
- 定期同步:利用
IndexedDB
的事务日志或第三方库(如 Dexie.js)监听数据变化