indexeddb 不支持自动删除过期数据库,需手动判断过期并调用 indexeddb.deletedatabase();过期逻辑可基于创建时间戳比对,删除时需处理 success/error/blocked 事件;更安全的替代方案是清空各 objectstore 而非删库。

IndexedDB 本身不提供“按过期时间自动删除整个数据库”的机制,也没有内置的 TTL(Time-To-Live)或自动清理功能。所谓“删除整个过期的本地数据库”,实际需要你**主动判断数据库是否过期,并调用 indexedDB.deleteDatabase() 手动删除**。
如何定义“过期”并触发删除
浏览器不会替你决定一个 IndexedDB 数据库是否该被删——你需要自己设计过期逻辑,比如:
- 在数据库首次创建时写入一个
createdAt时间戳(存于某 objectStore 的元数据记录中); - 每次打开数据库前,先读取该时间戳,与当前时间比对是否超过预设有效期(如 7 天);
- 若已过期,调用
indexedDB.deleteDatabase('dbName'),再重新初始化。
删除数据库的关键操作步骤
调用 deleteDatabase 是异步的,需监听 success / error / blocked 事件:
- success:数据库已成功删除,可立即新建同名数据库;
- blocked:说明还有其他页面或 worker 正在使用该数据库,此时不能强制删,需提示用户刷新或等待;
- error:权限问题、名称不存在等,应做降级处理(如清空内容而非删库)。
示例代码片段:
抓取并分析 OpenClaw JSONL 会话日志,重建并回填代理记忆文件。适用于:(1) 模型切换后记忆不完整,(2) 验证记忆覆盖度,(3) 重建丢失记忆,(4) 通过 cron/heartbeat 自动同步每日记忆。支持简单提取及基于 LLM 的叙事摘要,并自动清理敏感信息。
const req = indexedDB.deleteDatabase('myAppDB');
req.onsuccess = () => console.log('数据库已删除');
req.onerror = () => console.error('删除失败', req.error);
req.onblocked = () => console.warn('数据库正被使用,删除被阻塞');
更稳妥的替代方案:清空而非删除
如果只是想释放空间但不想冒“删库风险”(比如多标签页共用、PWA 后台同步依赖),推荐改用 清空所有 objectStore:
- 打开数据库(versionchange 事务);
- 遍历
db.objectStoreNames,对每个 store 调用clear(); - 保留数据库结构和版本,避免因删库引发的竞态或初始化异常。
这种方式更轻量、更安全,尤其适合缓存类数据。
注意事项与边界情况
删除数据库后,所有相关数据、索引、事务状态彻底消失,且不可恢复;
- 确保没有其他 tab 或 Service Worker 正在连接同一数据库;
- 不要在页面卸载(beforeunload)中执行 deleteDatabase,容易中断;
- 移动端 WebView 或旧版 Safari 可能存在 deleteDatabase 兼容性问题,建议加 try/catch 并 fallback 到 clear;
- 用户手动清除浏览数据(设置 → 清除缓存)也会一并删除 IndexedDB,无需额外干预。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










