IndexedDB 的 count() 和 clear() 方法属于 IDBObjectStore 实例,需在事务中调用:count() 统计记录数(支持全量或键范围),不加载数据、性能高;clear() 清空整个对象存储区但保留结构,仅支持全删且不可逆。

IndexedDB 本身没有直接的 count() 和 clear() 方法——它们属于 IDBObjectStore 实例,必须在事务中调用,且不能在数据库打开时直接使用。
count():统计对象存储区中的记录数量
要获取某张表(object store)里有多少条数据,需先开启只读事务,再调用 objectStore.count()。它返回一个 IDBRequest,通过 onsuccess 或 Promise 包装后取结果。
- 不传参数 → 统计全部记录
- 传入
IDBKeyRange→ 按范围统计(如主键区间、索引条件) - 注意:
count()不会加载实际数据,性能比遍历高得多
示例(Promise 封装):
function getCount(db, storeName) {
return new Promise((resolve, reject) => {
const tx = db.transaction(storeName, 'readonly');
const store = tx.objectStore(storeName);
const req = store.count();
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
}
// 使用
getCount(db, 'users').then(count => console.log('共', count, '个用户'));
clear():清空整个对象存储区
clear() 会删除 object store 中所有记录,但保留结构(如索引、键生成器等)。同样必须在读写事务中执行。
立即学习“Java免费学习笔记(深入)”;
- 不支持按条件清除,只能全删
- 若需部分清理,请用
delete()配合游标(cursor)或 key range - 操作不可逆,建议提前确认或备份关键数据
示例:
function clearStore(db, storeName) {
return new Promise((resolve, reject) => {
const tx = db.transaction(storeName, 'readwrite');
const store = tx.objectStore(storeName);
const req = store.clear();
req.onsuccess = () => resolve();
req.onerror = () => reject(req.error);
});
}
// 使用
clearStore(db, 'logs').then(() => console.log('日志已清空'));
注意事项与常见误区
-
count()和clear()都是异步操作,不能在同步上下文中等待结果 - 事务生命周期很短:必须在
onsuccess触发前完成所有请求,否则事务自动中止 - 不能对关闭的数据库或已结束的事务调用这些方法,会报
InvalidStateError - 若想统计/清空多个 store,需分别发起事务(不支持跨 store 批量操作)
补充:快速清空整个数据库(非单个 store)
没有内置的 “清空整个数据库” 方法,但可通过 deleteDatabase() + 重建实现:
- 调用
indexedDB.deleteDatabase(dbName)删除库 - 再用
indexedDB.open()重新打开并初始化 schema - 适合测试或重置场景;生产环境慎用


















