使用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

介绍终身机器人学习的数据集LIBERO

介绍终身机器人学习的数据集LIBERO

1 LIBERO的作用 LIBERO是一个用于研究多任务和终身机器人学习中知识迁移的综合基准测试平台,LIBERO是基于robosuite框架构建的。它专注于机器人操作任务,这些任务需要两类知识: 1. 陈述性知识:关于物体和空间关系的知识 2. 程序性知识:关于运动和行为的知识 2 核心原理 任务生成与基准设计 LIBERO提供了一个程序化生成管道,原则上可以生成无限数量的操作任务。系统包含130个任务,分为四个任务套件,每个套件都有受控的分布偏移: * LIBERO-Spatial/Object/Goal:专注于特定类型知识的迁移 * LIBERO-100:包含需要迁移纠缠知识的100个操作任务 学习框架 系统采用模仿学习作为主要学习方法,因为任务使用稀疏奖励函数(任务完成时获得+1奖励)。LIBERO提供高质量的人类遥操作演示数据集用于训练。 算法与策略架构 LIBERO实现了三种视觉运动策略网络: * bc_rnn_policy:基于RNN的行为克隆策略 * bc_transformer_policy:基于Transformer的行为克隆策略

物业ERP管理系统技术架构解析:2026年如何用快鹭低代码与AI破解行业痛点

物业ERP管理系统技术架构解析:2026年如何用快鹭低代码与AI破解行业痛点

凌晨调试代码时,收到物业经理朋友的紧急求助:其公司管理系统再次崩溃,Excel手工导出的收费报表错误百出,而业主投诉工单已堆积超过200条。这或许是超过60% 物业企业面临的典型技术困境。 在当前物业管理行业平均利润率仅5% 的背景下,传统技术架构已难以支撑企业发展需求。行业数据显示,超六成物业企业仍存在人工对账难、系统扩展性差等问题。本文从技术选型角度,解析2026年物业ERP系统的架构设计与实现方案。 一、行业技术痛点分析 数据孤岛问题成为物业系统最大架构挑战。传统物业系统中,收费、报修、巡检等模块往往独立部署,数据分散在不同系统和文件中,缺乏有效整合机制。据调研,基于传统架构的系统处理一张报修单平均需要48小时以上,而现代微服务架构可将此过程缩短至4小时以内。 系统扩展性不足制约业务创新。当物业企业尝试拓展社区团购、定制服务等新业务时,单体架构的系统往往需要进行大量二次开发。超过50%的数字化项目因架构僵化而无法快速响应业务变化。 技术债累积导致维护成本飙升。许多早期系统基于传统技术栈开发,缺乏完善的文档和模块化设计,新团队成员往往需要较长时间才能理解系统架构。

Flutter 三方库 eth_sig_util 的鸿蒙化适配指南 - 掌握以太坊加密签名核心技术、助力鸿蒙端 Web3 钱包与去中心化身份验证应用开发

Flutter 三方库 eth_sig_util 的鸿蒙化适配指南 - 掌握以太坊加密签名核心技术、助力鸿蒙端 Web3 钱包与去中心化身份验证应用开发

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 eth_sig_util 的鸿蒙化适配指南 - 掌握以太坊加密签名核心技术、助力鸿蒙端 Web3 钱包与去中心化身份验证应用开发 前言 在 OpenHarmony 鸿蒙应用的 Web3 浪潮中,安全性是应用生死存亡的关键。无论是构建非托管钱包、登录去中心化应用(dApp),还是执行 EIP-712 结构化数据的确认,都离不开严谨的以太坊签名与加密协议。eth_sig_util 作为一个专门针对以太坊签名习惯优化的 Dart 工具库,支持 personal_sign、signTypedData 以及公钥恢复等核心算法。本文将指导你如何在鸿蒙端集成 eth_sig_util,构建一套符合全球标准的加密验证体系。 一、原原理分析 / 概念介绍 1.

论文阅读:Training language models to follow instructions with human feedback

Ouyang L, Wu J, Jiang X, et al. Training language models to follow instructions with human feedback[J]. Advances in neural information processing systems, 2022, 35: 27730-27744. 引言 引言首先指出了当前大型语言模型(LMs)存在的一个核心问题:模型规模变大并不意味着它们能更好地遵循用户的意图 。具体而言,大型模型经常生成不真实、有毒或对用户毫无帮助的输出,这是因为语言模型的训练目标(预测网页上的下一个 token)与用户希望的目标(“有用且安全地遵循指令”)是错位的。作者的目标是让模型在“有用性”(Helpful)、“诚实性”(Honest)和“无害性”(Harmless)这三个方面与用户意图对齐。