Skip to content

快速开始

IndexedDB 不允许你随意改表结构,只能通过“版本升级”来改。

ts
import Dexie from "dexie";

class AppDB extends Dexie {
  users!: Dexie.Table<User, number>;

  constructor() {
    super("AppDB");
    this.version(1).stores({
      users: "++id, name, age, email",
    });
  }
}

export const db = new AppDB();

ts
await db.users.add({ name: "Tom", age: 18 });
ts
await db.users.bulkAdd([
  { name: "Tom", age: 18 },
  { name: "Jerry", age: 20 },
]);

ts
const user = await db.users.get(1);
ts
const list = await db.users.toArray();
ts
const adults = await db.users.where("age").above(18).toArray();

多条件(走索引)

ts
db.users.where("[name+age]").equals(["Tom", 18]);

组合索引要先在 stores() 里声明

即:

ts
users: "++id, name, age, [name+age]";

非索引字段查询

ts
db.users.filter((user) => user.email?.endsWith("@gmail.com")).toArray();

⚠️ filter 是全表扫描,数据大了慢

更新

ts
await db.users.update(1, { age: 19 });

ORM 风格更新

ts
const user = await db.users.get(1);
user.age++;
await db.users.put(user);

ts
await db.users.delete(1);

删库

ts
await db.users.clear();

事务

ts
await db.transaction("rw", db.users, async () => {
  await db.users.add({ name: "A" });
  await db.users.add({ name: "B" });
});