创建数据
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() 内部流程:
- 调用适配器执行数据库插入
- 将实体状态设置为
local = true, modified = false - 返回持久化后的实体实例
批量创建
使用 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()