Documentation
DataBase 模块提供三种不同实现的数据存储方案,用于在 MC Script API 环境中进行数据管理与跨行为包通信。
支持以下数据库类型:
| 类型 | 标识 | 描述 |
|---|---|---|
| DPDataBase | DP |
基于 DynamicProperty 的持久化存储 |
| ScoreBoardJSONDataBase | jSB |
基于计分板的 JSON 数据存储(支持跨包通信) |
| ScoreBoardDataBase | cSB |
对原版计分板的封装 |
import { DPDataBase, ScoreBoardJSONDataBase, ScoreBoardDataBase } from "SAPI-Pro/DataBase";所有数据库均继承自 DataBase<T>。
type DBTypes = "DP" | "jSB" | "cSB";name: string; // 数据库名称
type: DBTypes; // 数据库类型static DBMap: Record<string, DataBase<any>>用于存储所有已注册的数据库实例。实例在构造时自动注册。
static getDB(name: string): DataBase<any> | undefined
static getDBs(): DataBase<any>[]set(key: string, value: T): void
get(key: string): T | undefined
rm(key: string): void
keys(): string[]
clear(): void基于 DynamicProperty 实现的数据存储。
type DPValueTypes = string | number | boolean | Vector3;- 数据持久化存储
- 按行为包隔离
- 自动处理长字符串分片
- 性能较高
constructor(name: string, source: DPSource = world)第二个参数 source 支持 World、Entity、ItemStack,默认为 world。
用于抽象 DynamicProperty 操作的数据源,支持世界、实体和物品堆。
interface DPSource {
setDynamicProperty(identifier: string, value?: boolean | number | string | Vector3): void;
getDynamicProperty(identifier: string): boolean | number | string | Vector3 | undefined;
getDynamicPropertyIds(): string[];
clearDynamicProperties(): void;
getDynamicPropertyTotalByteCount(): number;
}set(key: string, value: DPValueTypes): void
get<T = DPValueTypes>(key: string): T | undefined
rm(key: string): void
keys(): string[]
clear(): voidentries(): [string, DPValueTypes | undefined][]返回当前数据库所有键值对。
setJSON(key: string, value: object): Promise<void>getJSON<T = unknown>(
key: string,
guard?: (val: unknown) => val is T
): T | undefined说明:
- 数据以 JSON 字符串形式存储
- 支持通过类型守卫进行校验
- JSON 解析失败时返回
undefined
当字符串长度超过限制时:
- 自动拆分为多个片段存储
- 使用以下结构:
<key>_arrlen:存储长度<key>_arr0 ~ n:存储分片内容
该过程对外透明。
static clearAllDP(): void
static getByteCount(): number
static getAllKeys(): string[]const db = new DPDataBase("MyData");
db.set("key", "value");
const value = db.get<string>("key");import { Configdb } from "sapi-pro";用于存储行为包配置数据。
基于计分板存储 JSON 数据。
- 支持复杂对象存储
- 支持大数据量
- 适用于跨行为包通信
constructor(name: string)计分板名称格式:
jSB_<name>
set(key: string, value: object): void
get<T = unknown>(key: string, guard?: (val: unknown) => val is T): T | undefined
rm(key: string): void
keys(): string[]
clear(): voidedit<T extends Record<string, any>>(
callback: (data: T) => boolean | void | undefined
): void说明:
- 自动读取数据并传入回调
- 若返回
false,则取消写入 - 默认执行写回操作
-
数据整体序列化为 JSON 字符串
-
字符串按长度拆分
-
每段以计分项形式存储:
- 名称:
<index + 字符串片段> - 分数:
index
- 名称:
-
读取时按分数排序并拼接
const db = new ScoreBoardJSONDataBase("data");
db.set("player", { score: 100 });
const data = db.get<{ score: number }>("player");import { exchangedb } from "sapi-pro";用于行为包之间的数据交换。
对原版计分板的封装。
constructor(
name: string,
displayName?: string,
usePrefix: boolean = true
)计分板名称:
(usePrefix ? "cSB_" : "") + name
set(key: string | Entity | ScoreboardIdentity, value: number | string): void
get(key: string | Entity | ScoreboardIdentity): number | undefined
add(key: string | Entity | ScoreboardIdentity, value: number | string): void
rm(key: string | Entity | ScoreboardIdentity): void
keys(): string[]
clear(): voidparticipants(): ScoreboardIdentity[]resetAll(): void重置所有计分项(使用命令实现)。
isDisplayAtSlot(slot: DisplaySlotId): boolean
setDisplaySlot(slot: DisplaySlotId): voiddispose(): void删除计分板对象(再次访问时会自动重建)。
getObj(key: string | Entity | ScoreboardIdentity): scoreboardObjconst sb = new ScoreBoardDataBase("record");
sb.set("player", 10);
sb.add("player", 5);
const score = sb.get("player");用于操作单个计分项的封装对象。
new scoreboardObj(
db: ScoreBoardDataBase,
key: string | Entity | ScoreboardIdentity
)get(): number | undefined
set(value: number): void
add(value: number): void
rm(): void
isValid(): booleanconst obj = sb.getObj("player");
obj.add(10);
if (obj.isValid()) {
console.log(obj.get());
}| 使用场景 | 推荐类型 |
|---|---|
| 配置存储 | DPDataBase |
| 大文本数据 | DPDataBase |
| 跨行为包通信 | ScoreBoardJSONDataBase |
| 积分/排行系统 | ScoreBoardDataBase |
- DynamicProperty 存储存在大小限制,应避免频繁写入超大数据
- ScoreBoardJSONDataBase 每次读写都会进行 JSON 序列化与反序列化,应避免存储大量内容
- ScoreBoardDataBase 仅适用于数值数据
- 长字符串操作已内部封装,无需手动处理