如何实现离线存储_j*ascript中indexeddb怎么用?


IndexedDB是浏览器提供的支持索引、事务和异步操作的本地NoSQL数据库,适用于离线场景下持久化存储大量结构化数据,容量可达几百MB。

如何实现离线存储_javascript中indexeddb怎么用?

IndexedDB 是浏览器提供的本地数据库,适合在离线场景下持久化存储大量结构化数据。它比 localStorage 更强大:支持索引、事务、异步操作、二进制数据(如 Blob),且容量通常达几百 MB(具体取决于浏览器和用户设置)。

核心概念要先搞清

IndexedDB 不是传统 SQL 数据库,没有表、SELECT 语句,而是基于对象仓库(object store)、键路径(keyPath)、索引(index)和事务(transaction)的 NoSQL 模式:

  • 数据库(IDBDatabase):整个 IndexedDB 实例,一个域名下可建多个,但需显式打开
  • 对象仓库(Object Store):类似“表”,每个数据库可有多个,必须在版本升级时创建(不能运行时新增)
  • 键(Key):每条记录的唯一标识,可以自动生成(autoIncrement)或由字段指定(keyPath)
  • 索引(Index):在非主键字段上建立,用于快速查询(如按用户名查用户)
  • 事务(IDBTransaction):所有读写操作必须在事务中进行,支持只读(readonly)和读写(readwrite)模式

基础用法:打开、建库、增删查

以下是一个完整示例,实现一个简单的待办事项(todo)存储:

1. 打开并初始化数据库

立即学习“J*a免费学习笔记(深入)”;

首次打开会触发 onupgradeneeded,此时可建对象仓库和索引:

AI Code Reviewer AI Code Reviewer

AI自动审核代码

AI Code Reviewer 112 查看详情 AI Code Reviewer
const DB_NAME = 'todoDB';
const DB_VERSION = 1;
const STORE_NAME = 'todos';

let db;

const request = indexedDB.open(DB_NAME, DB_VERSION);

request.onerror = () => console.error('打开数据库失败');
request.onsuccess = (e) => {
  db = e.target.result;
};

request.onupgradeneeded = (e) => {
  const newDb = e.target.result;
  // 创建对象仓库,主键为 id 字段(自动递增)
  const store = newDb.createObjectStore(STORE_NAME, { keyPath: 'id', autoIncrement: true });
  // 在 title 字段上建索引,方便按标题搜索
  store.createIndex('byTitle', 'title', { unique: false });
};

2. 添加一条数据

function addTodo(todo) {
  const tx = db.transaction(STORE_NAME, 'readwrite');
  const store = tx.objectStore(STORE_NAME);
  const req = store.add({ ...todo, createdAt: Date.now() });

  req.onsuccess = () => console.log('添加成功');
  req.onerror = () => console.error('添加失败');
}
// 调用:addTodo({ title: '买牛奶', done: false });

3. 查询全部或按条件查

// 查全部
function getAllTodos() {
  const tx = db.transaction(STORE_NAME, 'readonly');
  const store = tx.objectStore(STORE_NAME);
  const req = store.getAll();

  req.onsuccess = (e) => console.log(e.target.result); // 返回数组
}

// 按 title 精确查找(使用索引)
function findTodoByTitle(title) {
  const tx = db.transaction(STORE_NAME, 'readonly');
  const store = tx.objectStore(STORE_NAME);
  const index = store.index('byTitle');
  const req = index.get(title);

  req.onsuccess = (e) => console.log(e.target.result);
}

实用技巧与避坑点

实际开发中容易踩的几个坑,注意绕开:

  • 版本升级不能跳过中间版:比如当前是 v1,想升到 v3,必须依次触发 v2 和 v3 的 onupgradeneeded;否则旧版逻辑可能丢失
  • 事务生命周期很短:事务在事件循环结束前自动关闭,不要把异步操作(如 fetch、setTimeout)放在事务回调外再操作 store
  • 主键不能重复,但 keyPath 字段可为空:若设了 keyPath: 'id',又传入 { title: 'xxx' }(无 id),会报错;可改用 autoIncrement 或手动生成 id
  • 删除数据库用 indexedDB.deleteDatabase('name'),调试时可手动清除(DevTools → Application → Storage → Clear site data)

配合离线场景的典型流程

做 PWA 或离线应用时,常见组合是:网络正常时同步到服务端,断网时写入 IndexedDB,恢复后自动补传:

  • 监听 n*igator.onLine 变化,切换数据源(API / IDB)
  • 封装统一的 CRUD 方法,内部自动判断连通性
  • 用 Service Worker 拦截请求,对失败的 POST/PUT 请求存入 IDB 队列,再轮询重发
  • 避免直接在 UI 层调用 IDB API,建议用 Promise 封装(或用 idb 这类轻量库简化写法)

基本上就这些。IndexedDB 学起来门槛略高,但一旦掌握,离线能力就稳了。不需要追求一步到位,从一个对象仓库开始,边用边补索引和事务逻辑,很快就能上手。

以上就是如何实现离线存储_j*ascript中indexeddb怎么用?的详细内容,更多请关注其它相关文章!


# 高阶  # 番禺做一个网站优化  # 怎么来优化网站推广效果  # 池州网站推广排名  # 辽源seo教程是什么  # 青山seo优化源头厂家  # 便宜网站建设文案模板  # 宜良公司网站建设项目  # 大连seo软件平台  # 马鞍山网站优化怎么做的  # 个人网站论文推广  # 是一个  # 结构化  # javascript  # 如何处理  # 二进制数  # 主键  # 中有  # 多个  # 如何实现  # 离线  # 持久化存储  # app  # 浏览器  # java 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《书耽》更换手机号方法  大熊猫抓取竹子的“大拇指”其实是什么?蚂蚁庄园课堂今天答案最新11月30日  研招网官方网站招生平台入口_中国研究生招生信息网官网登录  PHP utf8_encode 字符编码转换陷阱与解决方案  百度竞价WAP显示PC链接问题  抖音团长模式怎么做?团长模式是什么意思?  《战地6》反作弊已成功拦截240万次作弊 发售第一周98%比赛没有作弊  拷贝漫画2025网页版入口 拷贝漫画官网免费看全集  Apple Music无故扣费引质疑  WooCommerce 新客户订单自动添加管理员备注教程  《东方财富》条件单关闭方法  济南公交卡手机充值指南  如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?  微信如何设置字体大小_微信字体设置的阅读舒适  如何在CSS中使用absolute实现登录弹窗居中_transform translate结合  《顺丰同城骑士》查看我的技能方法  TikTok视频播放不流畅怎么办 TikTok视频播放优化方法  C++怎么解决数值计算中的精度问题_C++浮点数误差与数值稳定性分析  VS Code源代码管理(SCM)视图的进阶使用技巧  获取WooCommerce产品在后台编辑页面的分类ID  Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  百度浏览器无法安装扩展程序_百度浏览器插件安装失败原因解析  123平台官方登录入口 123邮箱网页端在线沟通工具  《火花chat》搜索好友方法  sf漫画官网登录入口直达_sf漫画官方正版网址  视频号视频怎么免费保存到相册?保存到相册需要注意什么?  firefox火狐浏览器最新官网主页_ firefox火狐浏览器平台入口直达官方链接  处理含命名空间的XML文件 Power Query中的高级技巧  Win10输入法不见了怎么办 Win10找回语言栏图标教程  深入理解Python对象引用与链表属性赋值  荣耀Magic6 Pro拍照成像偏暗_荣耀Magic6 Pro夜景优化  喜茶GO更换登录账号方法  大众点评了却看不到是怎么回事  c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践  谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程  Yandex浏览器官方入口_Yandex搜索引擎中文版  Dagster资产间数据传递与用户配置管理教程  中大网校app做题记录清除方法  管理打开的编辑器:固定、分组和关闭技巧  火狐浏览器如何刷新修复浏览器 火狐浏览器“重置Firefox”功能详解  苹果手机聊天记录删除了如何恢复  宝妈做视频号该写什么标签话题?宝妈关注的话题有哪些?  顺丰快递收费标准查询_如何查看顺丰最新收费价格  TikTok网页版入口快速访问 TikTok官网账号登录方法  德邦快递查询入口登录官网 德邦快递单号查询系统入口  Django模型动态关联检查:高效管理复杂关系  《美篇》取消会员自动续费方法  构建可配置的J*aScript加权点击计数器与共享总计功能  火柴人战争网页版在线玩  更换小红书群背景怎么换?小红书群规则怎么设置? 

 2025-12-16

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.