使用Dexie操作前端数据库IndexedDB 教程

使用Dexie操作前端数据库IndexedDB 教程

Dexie.js 是对前端本地数据库 IndexedDB 的 API 进行封装的轻量级库,它简化了 IndexedDB 复杂的原生操作,提供了更简洁、直观的语法,便于开发者快速实现前端本地数据的持久化存储。

一、为什么选择 IndexedDB?

前端常见的本地存储方案(Cookie、LocalStorage、SessionStorage)均存在存储容量限制,无法满足大数据量的存储需求。IndexedDB 作为浏览器原生的本地数据库,具备大容量存储优势,具体对比如下:

  • Cookie:存储容量不超过 4KB,主要用于存储会话标识等少量信息;
  • LocalStorage:存储容量介于 2.5MB ~ 10MB 之间,仅支持字符串存储;
  • SessionStorage:存储容量与 LocalStorage 相当,但仅在当前会话有效,页面关闭后数据丢失;
  • IndexedDB:存储容量不低于 250MB,支持占用本地磁盘空间的 50%,可存储大量结构化数据,支持事务、索引等数据库核心特性。

二、安装 Dexie

使用包管理器(pnpm、npm、yarn)快速安装 Dexie:

pnpmadd dexie 

三、核心操作步骤

3.1 创建数据库(Database)

通过 new Dexie() 创建数据库实例,指定数据库名称。若数据库不存在则自动创建,若已存在则直接打开。

3.2 创建表(Table)

通过 version().stores() 定义数据库版本及表结构,包括主键、索引等信息。表结构定义需与数据库版本绑定,版本升级时可同步更新表结构。

importtype{ Table }from'dexie';// 定义表结构:版本1中创建 "users" 表 db.version(1).stores({ users:'++id, userName',// ++id 表示自增长主键;userName 表示为该字段创建索引});// 获取 "users" 表实例,用于后续数据操作let users: Table<StoreUserData>; users = db.table('users');

说明:

  • ++id:自增长整数主键,插入数据时无需手动指定 id,数据库会自动生成;
  • userName:为该字段创建索引,可提升按 userName 查询的效率。

3.3 数据操作:增删改查(CRUD)

3.3.1 新增数据(增)

使用 add() 方法插入单条数据,主键(id)会自动生成。

// 插入一条用户数据,无需指定 id db.users.add({ userName:'zhangsan'});
3.3.2 修改/新增数据(改)

使用 put() 方法实现“插入或更新”(upsert)功能:若数据不存在(根据主键判断)则新增,若已存在则覆盖修改。

// 若 id=1 的数据存在则修改 userName,不存在则新增该数据 db.users.put({ id:1, userName:'zhangsan'});

3.3.3 删除数据(删)

使用 delete() 方法根据主键删除单条数据。

3.3.4 查询数据(查)

Dexie 提供了丰富的查询方法,支持按主键查询、条件查询、排序、分页等场景:

// 1. 按主键查询单条数据 db.users.get(1).then(res =>console.log('主键id=1的用户:', res));// 2. 条件查询(两种常用方式)// 方式1:按字段条件查询 db.users.where('userName').equals('zhangsan').toArray().then(res =>console.log('用户名为zhangsan的用户:', res));// 方式2:按对象匹配条件查询 db.users.where({ userName:'zhangsan'}).toArray().then(res =>console.log('用户名为zhangsan的用户:', res));// 3. 查询第一条数据(按id升序) db.users.orderBy('id').first().then(res =>console.log('第一条用户数据:', res));// 4. 查询最后一条数据(按id升序) db.users.orderBy('id').last().then(res =>console.log('最后一条用户数据:', res));// 5. 查询表中数据总数 db.users.count().then(count =>console.log('用户总数:', count));// 6. 分页查询(按id倒序,查询前100条数据) db.users.orderBy('id').reverse()// 倒序排列(默认升序).offset(0)// 偏移量,从第0条开始(即跳过前0条).limit(100)// 限制查询数量,最多返回100条.toArray().then(res =>console.log('分页查询结果:', res));

四、TypeScript 封装优化

通过类封装数据库操作,结合 TypeScript 类型定义,提升代码可维护性和类型安全性:

importtype{ Table }from'dexie';import Dexie from'dexie';// 定义用户数据类型接口,约束数据结构exportinterfaceStoreUserData{ id?:number;// 主键可选,插入时自动生成 userName:string;// 用户名,必传字段}// 封装数据库类exportclassUserDataBaseextendsDexie{// 定义表实例,指定数据类型 users!: Table<StoreUserData>;// 数据库版本private localVersions =1;constructor(){// 调用父类构造函数,指定数据库名称super('UserDataBase');// 初始化数据库版本和表结构this.version(this.localVersions).stores({ users:'++id, userName'// 与前文表结构一致});// 赋值表实例this.users =this.table('users');}}// 创建数据库实例,供全局使用exportconst usersDB =newUserDataBase();

五、查看 IndexedDB 数据

可通过浏览器开发者工具直观查看和操作 IndexedDB 中的数据,步骤如下:

  1. 打开浏览器(Chrome/Firefox/Edge 等)的开发者工具(快捷键 F12 或 Ctrl+Shift+I);
  2. 切换到「应用」(Application)面板;
  3. 在左侧导航栏中找到「存储」-「IndexedDB」;
  4. 展开对应数据库(如 UserDataBase)和表(如 users),即可查看表中数据,支持新增、修改、删除等操作。

六、参考资料

Read more

中兴B863AV3.1-M2卡刷固件实战:从萌虎动画到无线网卡全解析

1. 中兴B863AV3.1-M2卡刷固件入门指南 第一次接触中兴B863AV3.1-M2刷机的朋友可能会觉得有些复杂,但其实只要跟着步骤来,整个过程并不难。这个固件最大的亮点就是加入了萌虎动画和无线网卡支持,让原本功能受限的机顶盒焕发新生。 我去年第一次刷这个固件时也踩过不少坑,比如U盘格式不对、刷机按键时机没掌握好等等。后来反复尝试了几次,终于摸清了门道。现在我的盒子开机就能看到可爱的萌虎动画,还能用USB无线网卡连接WiFi,彻底摆脱了网线的束缚。 这个固件适合哪些人呢?首先你得有个中兴B863AV3.1-M2的盒子,或者兼容的魔百盒E900V22C/D系列。其次最好有些基础的刷机经验,至少知道怎么进Recovery模式。如果你是纯小白,建议先看看其他基础教程练练手。 2. 萌虎动画的实现原理与定制 2.1 萌虎动画的技术解析 这个固件最吸引人的就是那个虎年主题的开机动画了。我拆解过这个动画包,发现它其实是由一系列PNG图片组成的bootanimation.zip。这个压缩包放在/system/media/目录下,包含三个关键部分: * desc.txt:定义动

前端瀑布流布局:从基础实现到高性能优化全解析

前端瀑布流布局:从基础实现到高性能优化全解析

瀑布流(Waterfall Layout)是前端开发中极具代表性的流式布局方案,以非固定高度、多列自适应、内容错落有致的特点成为图片展示、商品列表、内容资讯等场景的主流选择(如 Pinterest、花瓣网、小红书首页等)。其核心逻辑是让元素按自身高度自适应填充到页面空白区域,打破传统网格布局的固定行列限制,兼顾视觉美感与空间利用率。本文将从瀑布流的核心原理出发,依次讲解原生 JS 基础实现、响应式适配、高频问题解决方案及生产环境高性能优化方案,同时补充主流框架(Vue/React)的实战技巧,让你从入门到精通瀑布流开发。 一、瀑布流核心原理与适用场景 1. 核心设计原理 瀑布流的本质是 “多列布局 + 动态高度计算 + 元素精准定位”,核心步骤可概括为 3 点: 1.确定页面展示列数(根据设备宽度、设计稿要求动态调整); 2.计算每一列的当前累计高度,找到高度最小的列; 3.将下一个元素定位到该最小高度列的顶部,同时更新该列的累计高度。 整个过程类似 “往多个不同高度的杯子里倒水,

前端如何渲染 Markdown 格式:从基础到实战全指南

在前端开发中,我们常需要将 Markdown 文本(如接口文档、博客内容、用户评论)渲染成美观的 HTML 页面。不同于纯文本展示,Markdown 渲染需要借助专门的库解析语法规则,再结合样式实现可视化。本文将聚焦 “如何在前端页面中渲染 Markdown 内容”,从主流库选型到实战案例,带你快速掌握核心方法。 一、前端渲染 Markdown 的核心逻辑 Markdown 本质是 “轻量级标记语言”,无法直接被浏览器识别。前端渲染的核心流程是: 1. 解析:通过库将 Markdown 文本(如 # 标题)转换为 HTML 字符串(如 <h1>标题</h1>); 2. 渲染:将解析后的

告别“打字机”:Generative UI 如何重塑 AI 时代的前端交互?

告别“打字机”:Generative UI 如何重塑 AI 时代的前端交互?

自从大语言模型(LLM)爆发以来,前端开发者接到了无数“给系统加个 AI 对话框”的需求。我们熟练地接入 API,处理流式(Streaming)响应,看着文字像打字机一样一个个蹦出来。 但这真的是 AI 时代前端交互的终点吗? 想象一下这个场景:用户问“帮我对比一下苹果和微软的近期股价”。传统的聊天机器人只能吐出一堆干瘪的文字,或者勉强渲染一个 Markdown 表格。但作为一名前端工程师,你的组件库里明明躺着精美的 Echarts K线图、带有交互提示的卡片和丝滑的动画。 为什么我们不能让大模型直接“生成”一个可交互的 React 或 Vue 组件呢?答案是:可以。这就是目前前端领域最具颠覆性的范式——Generative UI(生成式 UI)。 什么是 Generative UI? Generative UI 是指结合 AI