我的个人网站:乐乐主题创作室
在现代Web应用开发中,客户端数据存储已成为构建离线优先应用、提升用户体验的关键技术。IndexedDB作为浏览器内置的NoSQL数据库,提供了强大的数据存储和检索能力。本文将全面介绍IndexedDB从基础概念到高级用法的完整知识体系,帮助开发者掌握这一重要技术。
IndexedDB是一种在用户浏览器中存储大量结构化数据的底层API,它具有以下核心特性:
存储方案 | 容量限制 | 数据类型 | 同步/异步 | 查询能力 |
---|---|---|---|---|
Cookies | ~4KB | 字符串 | 同步 | 无 |
localStorage | ~5MB | 键值对(字符串) | 同步 | 仅按键查询 |
WebSQL | ~50MB | 关系型 | 异步 | SQL查询 |
IndexedDB | 250MB+ | 结构化对象 | 异步 | 高级索引查询 |
// 打开或创建数据库
const request = indexedDB.open('MyDatabase', 1);
request.onerror = (event) => {
console.error('Database error:', event.target.error);
};
request.onsuccess = (event) => {
const db = event.target.result;
console.log('Database opened successfully');
// 在这里执行数据库操作
};
request.onupgradeneeded = (event) => {
const db = event.target.result;
// 创建对象存储空间(类似于表)
const store = db.createObjectStore('customers', {
keyPath: 'id', // 主键
autoIncrement: true // 自动生成主键
});
// 创建索引
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 = () => {
console.log('Customer added successfully');
};
request.onerror = (event) => {
console.error('Error adding customer:', event.target.error);
};
}
function getCustomer(db, id) {
return new Promise((resolve, reject) => {
const transaction = db.transaction(['customers'], 'readonly');
const store = transaction.objectStore('customers');
const request = store.get(id);
request.onsuccess = () => {
resolve(request.result);
};
request.onerror = (event) => {
reject(event.target.error);
};
});
}
function updateCustomer(db, customer) {
const transaction = db.transaction(['customers'], 'readwrite');
const store = transaction.objectStore('customers');
const request = store