indexeddb 无同步存在性检查方法,需通过打开数据库并监听 onupgradeneeded(触发则不存在)和 onsuccess(成功则存在)间接判断;对象仓库存在性可用 db.objectstorenames.contains('name') 安全校验。

IndexedDB 本身没有直接提供 databaseExists() 或 storeExists() 这样的同步判断方法。它的设计是异步且事件驱动的,因此“是否存在”必须通过打开或尝试访问行为来间接验证——关键不是查“有没有”,而是看“能不能按预期打开或访问”。
检查数据库是否存在(不创建)
最可靠的方式是尝试以当前版本号打开数据库,并在 onupgradeneeded 中主动中止升级流程,避免意外创建:
- 调用
indexedDB.open(dbName, currentVersion),其中currentVersion是你期望的已有版本(如1) - 监听
onupgradeneeded:如果触发,说明数据库不存在,或版本低于传入值 → 此时调用event.target.transaction.abort()并拒绝 Promise - 监听
onsuccess:说明数据库存在且版本匹配 → 调用db.close()后 resolve true - 注意:不能依赖
indexedDB.databases()(Chrome 支持但非标准,Firefox/Safari 不支持),也不建议用webkitGetDatabaseNames()(已废弃且兼容性差)
检查对象仓库是否存在
对象仓库(Object Store)是数据库结构的一部分,只能在 upgradeneeded 阶段创建或修改。运行时无法“查询是否存在”,但可通过以下方式安全判断:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 在
onsuccess回调拿到db实例后,用db.objectStoreNames.contains('storeName')判断(返回布尔值) - 该方法只读、无副作用,适用于已打开的数据库连接
- 例如:
if (db.objectStoreNames.contains('users')) { /* 存在 */ } - 注意:不能在
upgradeneeded外部调用transaction('storeName')来试探——会直接抛出异常
实际开发中的推荐做法
多数场景下,不需要单独“检查存在性”,而是按需初始化:
- 首次打开时,在
onupgradeneeded中统一建库建表,后续版本升级也在此处理结构变更 - 如果逻辑依赖某 store 必须存在,就在打开成功后立即校验
objectStoreNames.contains,不存在则报错或降级处理 - 对 iOS/WKWebView 等特殊环境,还需结合
db.onblocked和持久化测试(如写入后杀进程再重启验证数据是否保留) - 调试时直接用 DevTools → Application → IndexedDB 查看实时状态,比代码判断更直观
本质上,IndexedDB 的“存在性”是行为结果而非静态属性。与其反复检查,不如把版本管理和结构定义落在 upgradeneeded 里,让打开过程本身成为最权威的验证。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










