indexeddb 是浏览器原生事务型 nosql 数据库,支持结构化数据持久化、索引查询、异步读写及 blob 存储;需设计 synced 字段标识同步状态,用 autoincrement 或 uuid 作主键,建索引优化查询,事务保障写入可靠性,并在 online 时批量同步与清理。

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










