clear() 方法仅清空对象仓库中的全部数据,不删除仓库本身、不影响数据库结构或其他仓库;必须在“readwrite”或“versionchange”事务中调用,返回 idbrequest 对象,成功时 result 为 undefined。

使用 IndexedDB 的 clear() 方法清空对象仓库,本质是发起一个删除所有记录的异步请求,**它不会删除对象仓库本身,也不会影响数据库结构或其它对象仓库**。
clear() 方法的基本用法
clear() 是 IDBObjectStore 实例上的方法,返回一个 IDBRequest 对象。调用后,它会异步清空当前对象仓库中的全部数据。
- 必须在事务(
IDBTransaction)中调用,且事务需有写权限("readwrite"或"versionchange") - 不能在只读事务中使用,否则会抛出
InvalidStateError - 执行成功后,
onsuccess回调触发,result为undefined
完整示例:安全清空指定对象仓库
以下是一个典型的安全调用流程,包含错误处理和事务管理:
function clearStore(db, storeName) {
return new Promise((resolve, reject) => {
const transaction = db.transaction(storeName, 'readwrite');
const store = transaction.objectStore(storeName);
const request = store.clear();
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
});
}
// 使用方式
openDatabase().then(db => {
return clearStore(db, 'users'); // 清空 users 仓库
}).then(() => {
console.log('users 仓库已清空');
}).catch(err => {
console.error('清空失败:', err);
});
注意事项与常见问题
实际使用时容易忽略几个关键点:
-
事务生命周期:确保在事务完成前不关闭数据库或提前结束事务;
clear()请求必须在事务活跃期内发起 -
不存在的仓库会报错:如果
storeName不存在,transaction.objectStore()会直接抛出NotFoundError -
无法部分清空:
clear()只能全量删除;如需按条件删除,请改用delete()配合游标(cursor)遍历 - 不触发索引自动更新问题:清空后所有索引同步失效,但无需手动重建——IndexedDB 会自动维护索引一致性
对比:clear() vs 删除并重建对象仓库
有人误以为“清空”等于“重置结构”,但 clear() 和删除/重建仓库完全不同:
-
clear():仅删数据,保留仓库名、键路径、是否自增、所有索引定义 - 删除并重建:需在
upgradeneeded中调用deleteObjectStore()再createObjectStore(),会丢失原有索引和配置 - 除非需要重定义结构,否则优先用
clear(),更轻量、更安全
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











