跳到主要内容

创建数据

RxDB 提供了多种方式来创建新数据,支持单条创建和批量创建。

实例化后保存

最直接的方式是创建实体实例后调用 save() 方法:

const todo = new Todo({
title: '完成文档',
completed: false
});

// save() 会自动判断:新实体执行 create,已有实体执行 update
await todo.save();
自动判断

save() 内部通过 status.local 属性判断实体状态:

  • local = false → 调用 entityManager.create() 插入新记录
  • local = true → 调用 entityManager.update() 更新已有记录

使用 Repository 创建

通过实体类的静态方法 create() 创建:

const todo = new Todo({
title: '完成文档',
completed: false
});

const created = await Todo.create(todo);
// created 已持久化到本地数据库

Repository.create() 内部流程:

  1. 调用适配器执行数据库插入
  2. 将实体状态设置为 local = true, modified = false
  3. 返回持久化后的实体实例

批量创建

使用 entityManager.saveMany() 批量创建多个实体:

import { inject } from '@angular/core';
import { RxDB } from '@aiao/rxdb';

const rxdb = inject(RxDB);

const todos = [
new Todo({ title: '任务一', completed: false }),
new Todo({ title: '任务二', completed: false }),
new Todo({ title: '任务三', completed: false })
];

await rxdb.entityManager.saveMany(todos);

saveMany() 会将所有待保存实体的操作合并成一个 mutations 调用,比逐条 save() 更高效。

Proxy 自动跟踪

当通过 RxDB 查询获取或创建实体时,返回的对象是一个 Proxy 代理对象。该代理会自动拦截属性的 set 操作:

// 从查询获取的 todo 已经是 Proxy 对象
const todo = await firstValueFrom(Todo.findOne({ where: ... }));

// Proxy 拦截属性修改,自动标记 modified = true
todo.title = '新标题';
// 此时 getEntityStatus(todo).modified === true

// save() 时只会发送变更的字段(patch),而不是整个对象
await todo.save();

Proxy 工作原理

new Todo()  →  EntityManager.init  →  Proxy(entity)

┌────────────────┤
▼ ▼
set 拦截器 get 透传

modified = true
记录 patch

save() → 只发送 patch
变更检测机制
  • 深比较isEqual(oldValue, newValue) 避免无意义的标记
  • 外键清理:当关系外键设为 null 时,自动清理对应关系缓存
  • 异步合并:多个属性修改在同一帧内合并为一次 checkChange()