indexeddb 是浏览器内置事务型 nosql 数据库,支持结构化数据持久化、索引查询、事务写入及 blob 存储;离线应用需设计 synced 状态字段、合理主键与索引,并结合 online 事件实现自动同步与清理。

IndexedDB 是浏览器内置的事务型 NoSQL 数据库,专为离线场景设计,能可靠持久化存储大量结构化数据(包括对象、数组、Blob 等),容量通常达几百 MB。它不是“增强版 localStorage”,而是具备索引、事务、异步读写和二进制支持的完整本地数据库方案。
设计带状态标记的数据表结构
离线应用的核心是区分“已同步”和“待同步”数据。例如日志、表单草稿或用户操作记录,都应包含明确的状态字段,避免重复提交或丢失。
- 建表时定义 synced 布尔字段,默认
false,上传成功后更新为true - 主键推荐用
autoIncrement或 UUID,避免依赖服务端 ID(离线时不可用) - 对常用查询字段(如
status、createdAt)建立索引,提升离线检索效率
用事务保障离线写入可靠性
每次写入必须包裹在 readwrite 事务中,失败时可捕获并降级处理,而不是静默丢弃。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 调用
db.transaction(['storeName'], 'readwrite')显式开启事务 - 监听
transaction.oncomplete和transaction.onerror,确认结果 - 在 Safari 私密模式等受限环境里,先检测 IndexedDB 可用性,再 fallback 到内存暂存(不持久)
支持 Blob 类型实现多媒体离线播放
视频、音频、图片等文件无需转 base64 或 ArrayBuffer,直接存 Blob 即可节省内存与编码开销。
- 对象仓库 keyPath 设为字符串字段(如
url或id),Blob 作为普通属性值存入 - 读取后用
URL.createObjectURL(blob)生成临时地址供<video></video>或<audio></audio>使用 - 播放完毕及时调用
URL.revokeObjectURL(),防止内存泄漏
网络恢复后自动同步与清理
监听 online 事件触发批量同步,同步成功后更新状态并定期清理旧数据。
- 用索引查出所有
synced: false的记录,分批发送(避免单次请求过大) - 每条记录单独重试(带指数退避),失败记录保持
synced: false等下次尝试 - 同步完成后执行
delete或按时间策略清理过期缓存(如 7 天前的日志)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










