2021-06-06 05:16:54
IndexedDB 是 HTML5 提供的浏览器内置数据库,用于存储大量结构化数据,支持对象、数组、二进制等类型,采用异步 API 和事务机制,适合离线应用和本地缓存场景。
核心特点使用 indexedDB.open() 打开数据库,若不存在则创建。第二个参数为版本号,升级时需递增。
const request = indexedDB.open('MyAppDB', 1);2. 创建对象仓库(Object Store)在 onupgradeneeded 事件中定义数据表(对象仓库)和索引:
request.onupgradeneeded = (event) => { const db = event.target.result; if (!db.objectStoreNames.contains('users')) { const store = db.createObjectStore('users', { keyPath: 'id' }); // 主键为 'id' store.createIndex('name', 'name', { unique: false }); // 创建非唯一索引 }};3. 增删改查(CRUD)操作所有操作需在事务(transaction)中进行,指定操作模式(readonly 或 readwrite)。
添加数据:
request.onsuccess = (event) => { const db = event.target.result; const transaction = db.transaction(['users'], 'readwrite'); const store = transaction.objectStore('users'); store.add({ id: 1, name: 'Alice', email: 'alice@example.com' }); transaction.oncomplete = () => console.log('数据已保存');};读取数据:
const transaction = db.transaction(['users'], 'readonly');const store = transaction.objectStore('users');const getRequest = store.get(1); // 按主键查询getRequest.onsuccess = () => { if (getRequest.result) console.log('找到用户:', getRequest.result); else console.log('未找到该用户');};使用索引查询:
const index = store.index('name'); // 通过索引查询const search = index.get('Alice');search.onsuccess = () => console.log('通过姓名查到:', search.result);更新数据:
store.put({ id: 1, name: 'Alice', email: 'newemail@example.com' }); // 替换整条记录删除数据:
store.delete(1); // 按主键删除原生 API 较复杂,推荐使用封装库提升效率:
掌握 IndexedDB 可显著提升 Web 应用的离线能力和性能表现,是管理复杂本地数据的理想方案。