dexie.js封装了indexDB,以下详细列举dexie.js的常用API

Dexie.js 是 IndexedDB 的轻量封装库,核心优势是 Promise 化 API简洁的查询语法完善的类型支持事务管理。以下按「功能模块」详细列举其常用方法,包含语法、用途和示例,覆盖开发高频场景:

一、数据库初始化与配置

核心用于创建数据库实例、定义表结构、版本控制。

示例:初始化数据库

// 1. 创建数据库实例
const db = new Dexie('MyDatabase', { autoOpen: true });

// 2. 定义版本 1 的表结构
db.version(1).stores({
  users: '++id, email, name, age, [name+age]', // 表名:users
  // 主键:++id(自增主键);普通索引:email、name、age;复合索引:[name+age]
  books: 'isbn, title, author, tags[]', // 多值索引:tags[](数组类型字段)
});

// 3. 首次创建时插入默认数据
db.on('populate', async () => {
  await db.users.bulkAdd([
    { name: '张三', email: 'zhangsan@xxx.com', age: 25 },
    { name: '李四', email: 'lisi@xxx.com', age: 30 },
  ]);
});

二、表操作(获取 / 删除表)

三、CRUD 核心操作

所有操作均返回 Promise,支持 async/await,核心区分「单条操作」和「批量操作」。

红色文字是对所有操作均返回 Promise,支持 async/await的解释:Dexie 的所有数据库操作(增删改查、事务等)都不会 “立刻返回结果”,而是返回一个「Promise 对象」;同时支持用 async/await 语法简化这个异步操作的写法,让代码更易读)

1. 新增数据(Add/Put)

示例:新增数据

// 单条新增(自增主键)
const userId = await db.users.add({ name: '王五', email: 'wangwu@xxx.com', age: 28 });

// 单条更新(主键存在则覆盖)
await db.users.put({ id: userId, name: '王五', email: 'newwangwu@xxx.com', age: 29 });

// 批量新增
const userIds = await db.users.bulkAdd([
  { name: '赵六', email: 'zhaoliu@xxx.com', age: 32 },
  { name: '孙七', email: 'sunqi@xxx.com', age: 27 },
]);

2. 删除数据(Delete)

3. 更新数据(Update)

4. 查询数据(Read)

(1)按主键查询

(2)条件查询(where() 链式语法)

where() 是 Dexie 核心查询方法,支持索引过滤、排序、分页,返回「查询集合」(可链式调用)。

(3)查询结果处理(链式收尾)

条件查询后,需调用以下方法获取结果:

示例:条件查询

// 1. 查询 age ≥ 25 且 < 30 的用户,按 name 升序,取前 10 条
const users = await db.users
  .where('age')
  .between(25, 30, true, false) // 包含 25,不包含 30
  .orderBy('name')
  .limit(10)
  .getAll();

// 2. 查询 email 以 @xxx.com 结尾的用户,统计条数
const count = await db.users
  .where('email')
  .endsWith('@xxx.com')
  .count();

// 3. 查询 tags 包含「前端」的书籍(多值索引 tags[])
const frontendBooks = await db.books
  .where('tags')
  .includes('前端')
  .getAll();

// 4. 分页查询:第 2 页(每页 10 条),按 id 降序
const page2Users = await db.users
  .orderBy('id')
  .reverse()
  .offset(10) // 跳过前 10 条(第 1 页)
  .limit(10)
  .getAll();

四、事务处理

Dexie 事务支持「原子性」(要么全成功,要么全回滚),核心方法 transaction()

事务模式(mode)

  • 'readonly':只读事务(默认,仅查询,性能更高)
  • 'readwrite':读写事务(需新增 / 修改 / 删除数据时使用)

示例:事务操作

// 转账场景:A 扣钱,B 加钱(原子操作)
async function transfer(fromUserId, toUserId, amount) {
  return db.transaction('readwrite', db.users, async () => {
    // 1. 查询两个用户(事务内查询,避免脏读)
    const fromUser = await db.users.get(fromUserId);
    const toUser = await db.users.get(toUserId);

    if (!fromUser || !toUser || fromUser.balance < amount) {
      throw new Error('转账失败'); // 抛错则事务回滚
    }

    // 2. 更新余额
    await db.users.update(fromUserId, { balance: fromUser.balance - amount });
    await db.users.update(toUserId, { balance: toUser.balance + amount });

    return '转账成功';
  });
}

// 调用事务
try {
  const result = await transfer(1, 2, 100);
  console.log(result);
} catch (err) {
  console.error(err.message);
}

五、索引操作

索引是 IndexedDB 高效查询的核心,Dexie 支持多种索引类型,定义在表结构中,查询时通过 where() 使用。

索引类型(表结构定义)

示例:使用复合索引查询

// 表结构:users: '++id, [name+age]'(复合索引 name+age)
const users = await db.users
  .where('[name+age]') // 指定复合索引
  .between(['张三', 25], ['张三', 30]) // 按 name=张三、age 25-30 查询
  .getAll();

六、数据库维护

示例:删除数据库

// 删除名为 MyDatabase 的数据库
await Dexie.deleteDatabase('MyDatabase');

七、事件监听

Dexie 支持数据库和表级别的事件,用于监听数据变化。

示例:监听用户表变化

// 监听 users 表新增数据
db.users.on('add', (user, userId) => {
  console.log('新增用户:', user, '用户ID:', userId);
});

// 监听 users 表更新
db.users.on('update', (mods, userId) => {
  console.log('用户', userId, '更新内容:', mods); // mods: { age: 26 }
});

核心总结

  1. 初始化Dexie 构造函数 + version().stores() 定义表结构;
  2. CRUDadd/put/delete/update(单条)、bulkXXX(批量);
  3. 查询where() 条件链 + orderBy/limit/offset 排序分页;
  4. 事务transaction() 保证原子性操作;
  5. 索引:主键 / 普通 / 复合 / 多值索引,提升查询效率;
  6. 事件:监听数据变化和数据库状态。

所有方法均返回 Promise,需配合 async/await.then() 处理异步结果,避免回调地狱。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值