Javascript中的IndexedDB是什么_怎样用Javascript进行客户端数据存储?
发布时间 - 2025-12-31 00:00:00 点击率:次IndexedDB 是浏览器内置的、支持事务的键值对型客户端数据库,面向结构化数据,原生支持 objectStore 和索引,查询性能远超需手动解析的 localStorage。
IndexedDB 是什么?它不是 localStorage 的升级版
IndexedDB 是浏览器内置的、支持事务的、键值对型客户端数据库,不是 localStorage 的“增强版”或“替代品”。它面向结构化数据(比如对象数组、带索引的用户记录),而 localStorage 只能存字符串。如果你要存 1000 条带时间戳和分类的笔记,并支持按日期范围查询,localStorage 就得自己 parse/filter,性能会断崖式下跌;IndexedDB 则原生支持 objectStore 和 index,查起来快得多。
打开数据库并创建 objectStore 的最小可行步骤
IndexedDB 初始化有固定套路:先调用 indexedDB.open(),监听 onupgradeneeded 创建存储结构,再在 onsuccess 里拿到数据库实例。关键点是:版本号必须递增才能触发 onupgradeneeded;同一域名下数据库名唯一,重名不会覆盖,而是复用已有库(但结构可能旧)。
const request = indexedDB.open('myNotes', 2); // 版本号从 1 → 2 才进 upgrade
request.onupgradeneeded = function (event) {
const db = event.target.result;
if (!db.objectStoreNames.contains('notes')) {
const store = db.createObjectStore('notes', { keyPath: 'id' });
store.createIndex('byDate', 'createdAt', { unique: false });
}
};
request.onsuccess = funct
ion (event) {
const db = event.target.result;
// ✅ 此时 db 已就绪,可执行 add/get/transaction
};
写入和查询数据时最容易错的三件事
写入失败往往不是语法问题,而是忽略了 IndexedDB 的异步事务模型和作用域限制。常见错误包括:在事务关闭后还调用 add()、没处理 onerror 导致静默失败、用错索引名导致 get() 返回 undefined。
-
add()和put()必须在 active transaction 内执行,不能直接挂在db上 - 查询索引要用
index.get()或index.openCursor(),不能直接store.get('xxx')—— 后者只认主键 - 所有操作(包括
get)都返回IDBRequest对象,必须监听onsuccess才能取到结果,不是同步返回
const transaction = db.transaction(['notes'], 'readwrite');
const store = transaction.objectStore('notes');
const request = store.add({ id: Date.now(), title: 'Hello', createdAt: new Date() });
request.onsuccess = function () {
console.log('写入成功');
};
request.onerror = function () {
console.error('写入失败:', request.error);
};
IndexedDB 不适合什么场景?别硬套
它不适合存大量二进制(如未压缩图片)、不需索引的简单配置项、或需要跨浏览器同步的状态。前者用 Cache API 或 File System Access API 更合适;后者 localStorage 或 sessionStorage 足够轻量。另外,Safari 对 IndexedDB 的 deleteDatabase() 和大事务支持不稳定,批量删除超过 5000 条建议分批提交。
# javascript
# java
# 浏览器
# access
# session
# safari
# ai
# 作用域
# 键值对
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel用户密码怎么加密_Laravel Hash门面使用教程
如何在Tomcat中配置并部署网站项目?
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
EditPlus中的正则表达式实战(6)
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
免费视频制作网站,更新又快又好的免费电影网站?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
如何挑选最适合建站的高性能VPS主机?
Laravel如何与Pusher实现实时通信?(WebSocket示例)
详解Huffman编码算法之Java实现
重庆市网站制作公司,重庆招聘网站哪个好?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
千库网官网入口推荐 千库网设计创意平台入口
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
如何在宝塔面板中创建新站点?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
如何在橙子建站中快速调整背景颜色?
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Laravel如何实现API版本控制_Laravel版本化API设计方案
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
香港服务器建站指南:免备案优势与SEO优化技巧全解析
JavaScript如何实现错误处理_try...catch如何捕获异常?
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
微信小程序 input输入框控件详解及实例(多种示例)
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
详解Android——蓝牙技术 带你实现终端间数据传输
linux写shell需要注意的问题(必看)
,在苏州找工作,上哪个网站比较好?
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
昵图网官方站入口 昵图网素材图库官网入口
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
如何快速搭建自助建站会员专属系统?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
佛山企业网站制作公司有哪些,沟通100网上服务官网?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
Python文件流缓冲机制_IO性能解析【教程】
JavaScript如何操作视频_媒体API怎么控制播放
高防服务器租用指南:配置选择与快速部署攻略
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Android实现代码画虚线边框背景效果
如何打造高效商业网站?建站目的决定转化率
手机网站制作与建设方案,手机网站如何建设?


ion (event) {
const db = event.target.result;
// ✅ 此时 db 已就绪,可执行 add/get/transaction
};