快速开始
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" });
});