SqliteTreeRepository<T>
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteTreeRepository.ts:27
树形实体仓库
findDescendants / findAncestors 一律 addQueryCache(result, true)(forcedUpdate)。
这不只是为了刷新 hasChildren 等计算属性——非 forced 路径已经会刷新计算属性。
forcedUpdate 同时把 state.origin 重置为数据库行,从而抵消 P0-004:
迟到的本 tab CREATE/UPDATE 事件经 QueryManager#serialize → createEntityRef
→ EntityStatus.replace 会把活实体与 origin 一起回写成旧值,
之后的 save() 因 patch === {} 静默丢写。
代价:会覆盖调用方未保存的本地编辑。P0-004 修好之前不要改回非 forced,
否则 findAncestors 订阅在父级二次变更时不再发射
(见 shared-tree.suite.ts 「findAncestors 订阅:父级变更应触发增量更新」)。
与 PGliteTreeRepository 保持一致。
Extends
Type Parameters
| Type Parameter |
|---|
T extends EntityType |
Implements
Constructors
Constructor
new SqliteTreeRepository<T>(adapter, EntityType): SqliteTreeRepository<T>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepositoryBase.ts:21
Parameters
| Parameter | Type |
|---|---|
adapter | RxDBAdapterSqliteBase |
EntityType | T |
Returns
SqliteTreeRepository<T>
Inherited from
Properties
adapter
protected adapter: RxDBAdapterSqliteBase;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepositoryBase.ts:22
Inherited from
EntityType
readonly EntityType: T;
Defined in: packages/rxdb/dist/repository/RepositoryBase.d.ts:20
Inherited from
metadata
readonly metadata: EntityMetadata;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepositoryBase.ts:19
Inherited from
rxdb
protected readonly rxdb: RxDB;
Defined in: packages/rxdb/dist/repository/RepositoryBase.d.ts:19
Inherited from
_STATIC_METHODS
protected static _STATIC_METHODS: string[];
Defined in: packages/rxdb/dist/repository/RepositoryBase.d.ts:29
子类声明的"静态方法名"清单,用于把 User.findOne(...) 这样的方法
注入到实体类上(EntityManager.init 时挂)。
Remarks
用类字段 static 而非构造器里赋值 —— 字段初始化在 extends 链上是自底向上
合并的,所以子类定义的 _STATIC_METHODS 不会丢;运行时反射取的是当前类的字段。
Inherited from
SqliteRepository._STATIC_METHODS
Accessors
staticMethods
Get Signature
get static staticMethods(): string[];
Defined in: packages/rxdb/dist/repository/RepositoryBase.d.ts:37
当前类(含继承链上各层)声明的全部静态方法名
Remarks
没有沿原型链累加:每个子类自己写一份 _STATIC_METHODS,避免运行时
反射出祖先的 get / findOne 这类名字后,再被后代意外覆盖一次。
Returns
string[]
Inherited from
SqliteRepository.staticMethods
Methods
addQueryCache()
addQueryCache(sqliteSuccessResult, forcedUpdate?): Promise<InstanceType<T>[]>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepositoryBase.ts:69
添加缓存
Parameters
| Parameter | Type | Default value | Description |
|---|---|---|---|
sqliteSuccessResult | SqliteSuccessResult | undefined | - |
forcedUpdate | boolean | false | 强制刷新,在数据有的情况下也会更新数据,在修改数据的情况下需要 |
Returns
Promise<InstanceType<T>[]>
Inherited from
SqliteRepository.addQueryCache
count()
count(options): Promise<number>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepository.ts:55
查询实体数量
Parameters
| Parameter | Type | Description |
|---|---|---|
options | EntityStaticType<T, "countOptions"> | 查询选项(详见 CountOptions) |
Returns
Promise<number>
满足条件的行数
Implementation of
Inherited from
countAncestors()
countAncestors(options): Promise<number>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteTreeRepository.ts:46
查询祖先节点数量
Parameters
| Parameter | Type |
|---|---|
options | FindTreeOptions<T> |
Returns
Promise<number>
Remarks
指定 entityId 时:不包含当前节点,只统计祖先数量
Implementation of
ITreeRepository.countAncestors
countDescendants()
countDescendants(options): Promise<number>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteTreeRepository.ts:34
查询子孙实体数量
Parameters
| Parameter | Type |
|---|---|
options | FindTreeOptions<T> |
Returns
Promise<number>
Remarks
- 指定 entityId 时:不包含当前节点,只统计后代数量
- 不指定 entityId 时:统计所有根节点及其后代的总数
Implementation of
ITreeRepository.countDescendants
create()
create(entity): Promise<InstanceType<T>>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepository.ts:61
创建实体
Parameters
| Parameter | Type | Description |
|---|---|---|
entity | InstanceType<T> | 实体实例(通常由 EntityManager.instantiate 创建) |
Returns
Promise<InstanceType<T>>
持久化完成后的实体;与入参不是同一引用(实现可换新实例)
Implementation of
Inherited from
createEntityRef()
createEntityRef(data): EntityInstanceType<T>;
Defined in: packages/rxdb/dist/repository/RepositoryBase.d.ts:50
创建(或复用)一个实体引用
Parameters
| Parameter | Type | Description |
|---|---|---|
data | EntityUpdateData<T> | 字段初始值;其中 id 缺省时会自动生成 |
Returns
已挂到 EntityManager 缓存里的实体实例
Remarks
不管入参 id 是否已存在于缓存,都会优先返回缓存里的实例(覆盖式刷新);
走 rxdb.entityManager.createEntityRef 是为了复用同一份引用语义,避免
不同调用栈里拿到的是两个状态不同步的克隆。
Inherited from
SqliteRepository.createEntityRef
find()
find(options): Promise<InstanceType<T>[]>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepository.ts:48
按查询条件读实体,并把结果行合进身份映射。
Parameters
| Parameter | Type | Description |
|---|---|---|
options | EntityStaticType<T, "findOptions"> | 查询条件 |
Returns
Promise<InstanceType<T>[]>
结果行对应的实体(命中缓存的返回同一引用)
Remarks
回填走 SqliteRepositoryBase.mergeQueryCache 而不是 addQueryCache(result):
后者在 forcedUpdate = false 下只建新实体、不碰已缓存的,于是任何绕过 ORM 的写
(提交图的 HEAD CAS、启用提交能力的 CAS)落库之后,本进程再怎么 find() 都只读得到
缓存里那份旧值——CAS 明明把 headRevision 推到了 1,读回来还是 0,下一次提交因此
永远撞 head_revision_conflict。PGlite 那一端每次读都回填,同一段代码在两个后端上
结果不同。
也不用 addQueryCache(result, true):那是整行覆盖 + modified 归零,会把用户尚未
保存的编辑写进基线后静默清空(见 entity-status.ts#applyExternal)。
Implementation of
Inherited from
findAncestors()
findAncestors(options): Promise<InstanceType<T>[]>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteTreeRepository.ts:40
查询祖先节点
Parameters
| Parameter | Type |
|---|---|
options | FindTreeOptions<T> |
Returns
Promise<InstanceType<T>[]>
Remarks
指定 entityId 时:包含当前节点 + 祖先节点
Implementation of
findByRowIds()
findByRowIds(rowIds, forceRefresh?): Promise<InstanceType<T>[]>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepositoryBase.ts:29
Parameters
| Parameter | Type | Default value |
|---|---|---|
rowIds | bigint[] | undefined |
forceRefresh | boolean | false |
Returns
Promise<InstanceType<T>[]>
Inherited from
findDescendants()
findDescendants(options): Promise<InstanceType<T>[]>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteTreeRepository.ts:28
查询子孙实体
Parameters
| Parameter | Type |
|---|---|
options | FindTreeOptions<T> |
Returns
Promise<InstanceType<T>[]>
Remarks
- 指定 entityId 时:包含当前节点 + 子孙节点
- 不指定 entityId 时:返回所有根节点及其子孙
Implementation of
ITreeRepository.findDescendants
findOne()
findOne(options): Promise<InstanceType<T> | undefined>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepository.ts:26
Parameters
| Parameter | Type |
|---|---|
options | EntityStaticType<T, "findOneOptions"> |
Returns
Promise<InstanceType<T> | undefined>
Inherited from
get()
get(id): Promise<InstanceType<T>>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepository.ts:14
Parameters
| Parameter | Type |
|---|---|
id | EntityStaticType<T, "idType"> |
Returns
Promise<InstanceType<T>>
Inherited from
getEntityRef()
getEntityRef(id):
| EntityInstanceType<T>
| undefined;
Defined in: packages/rxdb/dist/repository/RepositoryBase.d.ts:57
按 ID 在当前进程的实体缓存中查找实体
Parameters
| Parameter | Type | Description |
|---|---|---|
id | EntityStaticType<T, "idType"> | 实体主键 |
Returns
| EntityInstanceType<T>
| undefined
缓存命中则返回实例,未命中返回 undefined(不触发数据库查询)
Inherited from
hasEntityRef()
hasEntityRef(id): boolean;
Defined in: packages/rxdb/dist/repository/RepositoryBase.d.ts:68
判定当前进程的实体缓存里是否有指定 ID
Parameters
| Parameter | Type | Description |
|---|---|---|
id | EntityStaticType<T, "idType"> | 实体主键 |
Returns
boolean
缓存命中返回 true,否则 false
Remarks
等价于 getEntityRef(id) !== undefined,单独提供是为了让"批量预热"和
"差异同步"等热点路径省掉一次引用创建 / 取状态的开销。
Inherited from
mergeQueryCache()
protected mergeQueryCache(sqliteSuccessResult): Promise<InstanceType<T>[]>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepositoryBase.ts:86
把结果行合进身份映射:干净实体整行刷新,脏实体逐字段避让未保存的编辑。
Parameters
| Parameter | Type | Description |
|---|---|---|
sqliteSuccessResult | SqliteSuccessResult | 一次 SELECT 的结果集 |
Returns
Promise<InstanceType<T>[]>
结果行对应的实体(命中缓存的返回同一引用)
Remarks
与 addQueryCache 的分工是「读」与「写」:写路径(create / update)知道自己
刚刚写了什么,用 forcedUpdate 整行盖回去是对的;读路径拿到的是别人写的行,可能
落在一个用户正在编辑的实体上,只能用 state.modified ? mergeExternal : replace
这一对策略——这正是 entity-status.ts#applyExternal 的语义,它把「查询结果回填」
明确列为必须分流的三条路径之一。
Inherited from
SqliteRepository.mergeQueryCache
remove()
remove(entity): Promise<InstanceType<T>>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepository.ts:82
删除实体
Parameters
| Parameter | Type | Description |
|---|---|---|
entity | InstanceType<T> | 待删除的实体(按 id 定位) |
Returns
Promise<InstanceType<T>>
删除完成后的实体(字段清空、local 置为 false)
Implementation of
Inherited from
update()
update(entity, patch): Promise<InstanceType<T>>;
Defined in: packages/rxdb-adapter-sqlite-core/src/repository/SqliteRepository.ts:71
更新实体
Parameters
| Parameter | Type | Description |
|---|---|---|
entity | InstanceType<T> | 待更新的实体(提供 id 与最新字段) |
patch | Partial<InstanceType<T>> | 字段级 patch;未列出的字段不会被改动 |
Returns
Promise<InstanceType<T>>
持久化完成后的实体
Implementation of
Inherited from
updateEntity()
updateEntity(entity, update): void;
Defined in: packages/rxdb/dist/repository/RepositoryBase.d.ts:80
用 update 覆盖实体字段
Parameters
| Parameter | Type | Description |
|---|---|---|
entity | InstanceType<T> | 目标实体 |
update | InstanceType<T> | 待写入的字段;主键 id 也会被赋值(用于 hydrate 场景) |
Returns
void
Remarks
走 EntityStatus.applyExternal,保证 dirty tracking 与 patch 生成走的是同一条路径,
且实体有未保存编辑时逐字段避让而不是整行覆盖 —— 活查询整批回填会命中已被用户改过的实体,
无条件 replace 会静默吃掉那些编辑。