跳到主要内容

RxDBAdapterLocalBase

Defined in: packages/rxdb/src/rxdb-adapter.ts:372

数据库适配器基类(本地)

Extends​

Extended by​

Constructors​

Constructor​

new RxDBAdapterLocalBase(rxdb): RxDBAdapterLocalBase;

Defined in: packages/rxdb/src/rxdb-adapter.ts:328

Parameters​

ParameterType
rxdbRxDB

Returns​

RxDBAdapterLocalBase

Inherited from​

RxDBAdapterBase.constructor

Properties​

repository_cache​

protected readonly repository_cache: Map<EntityType, RepositoryInstance<EntityType>>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:326

Inherited from​

RxDBAdapterBase.repository_cache


repository_map​

protected readonly repository_map: Map<string, AdapterRepositoryConstructor<RxDBAdapterLocalBase, RepositoryInstance<EntityType>>>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:325

Inherited from​

RxDBAdapterBase.repository_map


rxdb​

readonly rxdb: RxDB;

Defined in: packages/rxdb/src/rxdb-adapter.ts:328

Inherited from​

RxDBAdapterBase.rxdb

Accessors​

workingTreeCaptureHook​

Get Signature​

get workingTreeCaptureHook():
| WorkingTreeCaptureHook
| undefined;

Defined in: packages/rxdb/src/rxdb-adapter.ts:390

Internal

捕获运行时;未启用提交能力的库上恒为 undefined。

Returns​

| WorkingTreeCaptureHook | undefined


workingTreeRawWriteContext​

Get Signature​

get workingTreeRawWriteContext(): RawWriteContext;

Defined in: packages/rxdb/src/rxdb-adapter.ts:416

Internal

本适配器当前的 raw 写判定上下文(adapter-contract.md §2)

Remarks​

rawQuery?() 是这张接口上的可选方法(见上方 IRxDBAdapter),核心包没法像四个挂载点 那样替适配器包住它——判定只能由各适配器自己的 rawQuery 实现调用 gateRawWrite(sql, ctx, …)。 那句调用要的 ctx 由这里交出来,于是六个适配器需要写对的只有「把它转给判定」这一句, 「能力位怎么算」「域从哪来」两个真正容易写歪的问题一次都不会落到它们头上。

能力位直接由捕获运行时装没装上决定,不另存一个布尔:运行时只在能力位为真时被装上 (RxDB.connect() 读到真、或 workingTree.enable() 刚翻开)。再存一份就是第二份真相, 而两份不同步的后果是单向的——门禁以为没开,raw 写全部放行。上下文对象本身在 setWorkingTreeCaptureHook() 里与运行时同一句赋值建好,不是每次取值新建:取值器在每条 raw 语句上都被调用,而它不含 per-call 状态。两个字段只在那一处一起变,「装了新运行时却 交出绑着旧运行时的闭包」因此不是一种可达状态。

交出去的是判定入口本身,不是判定要看的那些东西(域、列集、受信意图)。核心因此不必 复述捕获认什么,也就不存在「拷了一份域出来、插件后续登记的派生索引列只落进其中一份」这类 双份清单——判定自始至终在运行时手上那一份上跑。

Returns​

RawWriteContext

Methods​

bootstrapTransaction()​

bootstrapTransaction<T>(fun, transactionLog?): Promise<Awaited<ReturnType<T>>>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:535

Internal

执行 引导期(表结构尚未就绪)的事务。

Type Parameters​

Type Parameter
T extends TransactionFun

Parameters​

ParameterTypeDescription
funT事务回调函数
transactionLog?boolean是否写事务日志。默认 true;纯 DDL / 元数据引导应显式传 false

Returns​

Promise<Awaited<ReturnType<T>>>

Remarks​

与 transaction 的唯一区别是跳过「引导已完成」就绪门。适配器的就绪门等的正是 RxDB.connect(),而引导期的调用方就在那个 promise 里面 —— 走 transaction 会等自己, 永久挂起。此时表可能尚未建出,调用方自己负责顺序。

调用方限于两类:RxDB.connect() 自身的引导链路(水位线、建表、迁移),以及 在 connect() 内部被安装的插件(它们的 install() 同样跑在那条 promise 里, 见 @aiao/rxdb-plugin-search 的 FTS 安装)。业务代码一律用 transaction。

transactionLog 必须在这里就能传:引导期的 DDL 不属于任何用户变更,写日志会白白触发 一次分支号读取与全量触发器重建。默认实现直接委托 transaction, 只有自带就绪门的适配器需要覆写。


completeBootstrap()​

completeBootstrap(): void;

Defined in: packages/rxdb/src/rxdb-adapter.ts:571

Internal

关闭引导窗:RxDB.connect() 完成建表后调用一次。

Returns​

void

Remarks​

自带就绪门的适配器(SQLite family / PGlite)在引导窗内让 query() / rawQuery() / createTables() 跳过就绪门 —— 那道门等的正是尚未 settle 的 RxDB.connect()。 本方法把状态翻到 ready,此后所有入口一律走正常的就绪等待。 没有就绪门的 adapter 保持默认的 no-op 实现。


createTables()​

abstract createTables(EntityTypes, entities?): Promise<boolean>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:575

Parameters​

ParameterType
EntityTypesEntityType[]
entities?any[]

Returns​

Promise<boolean>


deleteByIds()​

abstract deleteByIds(entityName, ids): Observable<void>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:653

按 ID 列表批量删除(QueryCache 专用)

用于清理本地缓存中已被远程删除的数据。

Parameters​

ParameterTypeDescription
entityNamestring实体名称
idsstring[]要删除的 ID 列表

Returns​

Observable<void>

Observable<void>

Example​

adapter.deleteByIds('Product', ['p1', 'p2']).subscribe();

getMetadataByIds()​

abstract getMetadataByIds(entityName, ids): Observable<Map<string, string>>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:621

获取指定 ID 列表的元数据(QueryCache 专用)

用于本地缓存新鲜度检查,返回 ID → updatedAt 映射。

Parameters​

ParameterTypeDescription
entityNamestring实体名称
idsstring[]实体 ID 列表

Returns​

Observable<Map<string, string>>

Observable<Map<string, string>> - ID → updatedAt 映射

Example​

adapter.getMetadataByIds('Product', ['p1', 'p2'])
.subscribe(map => {
// map: Map `{ 'p1' => '2026-01-12T10:00:00Z', 'p2' => '2026-01-12T09:30:00Z' }`
});

getRepository()​

abstract getRepository<T, RT>(EntityType): RT;

Defined in: packages/rxdb/src/rxdb-adapter.ts:330

Type Parameters​

Type ParameterDefault type
T extends EntityType-
RT extends IRepository<T>IRepository<T>

Parameters​

ParameterType
EntityTypeT

Returns​

RT

Inherited from​

RxDBAdapterBase.getRepository


getRxDBChangeSequence()​

abstract getRxDBChangeSequence(): Promise<number>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:582

Returns​

Promise<number>


isEncryptedAtRest()?​

optional isEncryptedAtRest(value): boolean;

Defined in: packages/rxdb/src/rxdb-adapter.ts:471

判定一个落库值是否已处于「加密后的 at-rest 形态」(FR-038)。

Parameters​

ParameterTypeDescription
valueunknown落库列里的值;调用方保证它既非 null 也非 undefined

Returns​

boolean

是加密后的落库形态时为 true

Remarks​

缺席是契约允许的形态,与 RxDBAdapterLocalBase.reconcileEntityIndexes 同一 口径:不支持列加密的适配器不实现它。缺席不等于放行——调用方(提交写路径)拿不到 判定器却确实有加密列要判时,fail-closed 地抛错,而不是跳过检查。

声明在这里、实现留给适配器,是因为权威判定器是 @aiao/rxdb-adapter-encrypted 的 isEnvelope,而 @aiao/rxdb 不能依赖它:后者 peer-depend 前者,依赖方向是反的。 一个 PropertyType.string 的加密列,明文与密文都是字符串,核心自己猜形状等于装一个 会看走眼的门卫。

与 RxDBAdapterLocalBase.setWorkingTreeCaptureHook 同属「可选能力槽位」:核心 只声明位置与语义,不替六个后端决定有没有。


isTableExisted()​

abstract isTableExisted(EntityType): Promise<boolean>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:509

Parameters​

ParameterType
EntityTypeEntityType

Returns​

Promise<boolean>


mergeChanges()​

abstract mergeChanges(
actions,
localChanges?,
disableTriggers?
): Promise<number | void>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:598

应用压缩后的变更到本地实体表

实现策略(SQLite):

  1. 将 actions 转换为 SQL 操作
  2. 在事务中: a) 执行 SQL 操作实体表(INSERT/UPDATE/DELETE) b) 批量插入 localChanges 到 RxDBChange 表(用于历史追踪)
  3. 发送本地事件通知 UI 更新

Parameters​

ParameterTypeDescription
actionsSwitchVersionActions压缩后的变更操作集合(从远程 pull 来的)
localChanges?Omit<RxDBChange, "id">[]需要保存到本地 RxDBChange 表的记录(可选)
disableTriggers?boolean是否禁用触发器(用于 pull 等操作,避免创建 RxDBChange)

Returns​

Promise<number | void>


migrateSystemSchema()​

migrateSystemSchema(): Promise<void>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:505

在应用迁移或仓储运行前升级 RxDB 拥有的表。 不需要持久化系统 schema 状态的 adapter 保持默认的 no-op 实现。

Returns​

Promise<void>


physicalTableNames()​

physicalTableNames(metadata): readonly string[];

Defined in: packages/rxdb/src/rxdb-adapter.ts:497

一张实体表在本适配器发出的 SQL 里可能被写成的全部名字。

Parameters​

ParameterTypeDescription
metadataEntityMetadata实体元数据;答案只由它决定,不读任何实例状态

Returns​

readonly string[]

未归一化、不带 schema 限定的物理表名;至少一个

Remarks​

命名规则归写表的那一方所有。 在这条能力之前, @aiao/rxdb-plugin-working-tree 的版本化域自己按 '$' 把 sqlite 家族的折叠规则重拼了 一遍。抄来的规则不会因为原件改了而报错,它只是开始算错——而算错的后果是单向的: raw 写门禁认不出某张受版本控制的表,于是静默放行一条绕过捕获的写。

默认实现交出逻辑名、一个字都不猜。替后端猜一个「常见」形态(比如把 sqlite 家族的 namespace$table 写成默认)只是把抄规则这件事从插件挪到核心,而且从此没有任何一个 后端会因为忘了覆写而被发现——它会一直拿着别人的规则算自己的表名。

有默认实现而不是 abstract,与 RxDBAdapterLocalBase.migrateSystemSchema 同一口径:这是一次对既有基类的扩展,abstract 会让仓外每一个自建适配器在升级时直接 编译不过,而它们里面不折叠命名空间的那一批本来就是对的。代价是「忘了覆写」与 「确实不需要」在类型上同形;折叠命名空间的后端(sqlite 家族)必须自己覆写。

不带 schema 限定:"public"."post" 这种形态在 raw 判定的限定剥离一步里已经被还原成 逻辑名了,这里再登记一遍只是同一个名字的第二种写法。要登记的是剥不掉的那一种。


reconcileEntityIndexes()?​

optional reconcileEntityIndexes(EntityTypes): Promise<void>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:578

在用户迁移和缺表补建后幂等收敛实体索引。

Parameters​

ParameterType
EntityTypesEntityType[]

Returns​

Promise<void>


repository()​

protected repository<RT>(repositoryName, RepositoryClass): void;

Defined in: packages/rxdb/src/rxdb-adapter.ts:332

Type Parameters​

Type Parameter
RT extends RepositoryInstance<EntityType>

Parameters​

ParameterType
repositoryNamestring
RepositoryClassAdapterRepositoryConstructor<RxDBAdapterLocalBase, RT>

Returns​

void

Inherited from​

RxDBAdapterBase.repository


runInTransaction()​

runInTransaction<T>(fun, transactionLog?): Promise<Awaited<ReturnType<T>>>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:556

新开一个事务,或者复用调用方已经在的那个。

Type Parameters​

Type Parameter
T extends TransactionFun

Parameters​

ParameterTypeDescription
funT事务工作,参数是本次事务的 executor
transactionLog?boolean是否写事务日志

Returns​

Promise<Awaited<ReturnType<T>>>

fun 的返回值

Remarks​

与 transaction 的差别不在这个方法体里,而在 this 是谁:真实适配器上两者同义, 都新开一个排队事务;而事务内的调用方拿到的是 executor 门面,门面把本方法特判成 executor.run()——复用当前事务且绝不重新入队。SQLite family 与 PGlite 各自的覆写只是 在这一句前面加了断连 / 只读断言,语义与此处逐字相同。

捕获运行时要写工作树行就必须有一个 executor,而「该新开还是该复用」只有调用宿主知道。 直接调 transaction() 的话,事务内的那一半调用会去排队等一个自己正占着的槽位——表现为 永久挂起而不是报错。


setWorkingTreeCaptureHook()​

setWorkingTreeCaptureHook(hook): void;

Defined in: packages/rxdb/src/rxdb-adapter.ts:437

Internal

装上或卸下捕获运行时(adapter-contract.md §1 的四个挂载点)。

Parameters​

ParameterTypeDescription
hook| WorkingTreeCaptureHook | undefined接管四个挂载点的运行时;undefined 卸载

Returns​

void

Remarks​

挂载装在这里而不是让六个适配器各自在自己的 transaction() 里插一句:少写一次、 写晚一次(在业务写之后才校验 token)都没有任何东西能发现,而那正是 §2「判定实现只有 一份」要排除的形态。

调用方是 RxDB.connect()(确认能力位为真之后)与 workingTree.enable()(翻位成功 之后)。未启用的库上一次都不会被调用,于是四个写原语连一层转发都没有。

幂等:已经装过就先卸下再装,不会叠成两层。


switchBranch()​

abstract switchBranch(options): Promise<void>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:580

Parameters​

ParameterType
optionsSwitchBranchOptions

Returns​

Promise<void>


transaction()​

Call Signature​

abstract transaction<T>(fun, transactionLog?): Promise<Awaited<ReturnType<T>>>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:511

Type Parameters​
Type Parameter
T extends TransactionFun
Parameters​
ParameterType
funT
transactionLog?boolean
Returns​

Promise<Awaited<ReturnType<T>>>

Call Signature​

abstract transaction(fun, transactionLog?): Promise<unknown>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:512

Parameters​
ParameterType
funTransactionFun
transactionLog?boolean
Returns​

Promise<unknown>


upsertMany()​

abstract upsertMany<T>(entityName, data): Observable<void>;

Defined in: packages/rxdb/src/rxdb-adapter.ts:637

批量 upsert 数据(QueryCache 专用)

执行 INSERT OR REPLACE 语义,用于缓存远程拉取的数据。

Type Parameters​

Type Parameter
T

Parameters​

ParameterTypeDescription
entityNamestring实体名称
dataT[]要写入的数据列表

Returns​

Observable<void>

Observable<void>

Example​

adapter.upsertMany('Product', [product1, product2]).subscribe();