数据库操作

用户的属性可以存储每个用户自己的数值。但是,有的时候,我们需要存储其它更复杂的数据。例如,不同玩家之间可能需要共享一些数据,例如公会信息、排行榜数据等。使用数据库,可以将这些数据以树状节点形式存储,方便在多个玩家之间共享和访问。

基本原理

数据库通过类似目录的形式管理和存放数据,每个领域都有一个所有玩家共用的数据库。在数据库中,可以创建任意层级的节点,并在每个节点中存储一个值。
例如,下面这个数据库有三个节点“公会”“市场”“副本”,其中“公会”节点下有名字为公会名称的两个子节点,在这些节点下,还有『财富』『人数』等子节点。
├─ 公会
│  ├─ 神仙打架俱乐部
│  │  ├─ 人数
│  │  ├─ 等级
│  │  ├─ 财富
│  ├─ 拖延症治疗中心
│  │  ├─ 人数
│  │  ├─ 等级
│  │  ├─ 财富
├─ 市场
│  ├─ 订单1
│  │  ├─ 卖家
│  │  ├─ 是否成交
│  │  ├─ 价格
│  │  ├─ 物品名称
│  ├─ 订单2
│  │  ├─ 卖家
│  │  ├─ 是否成交
│  │  ├─ 价格
│  │  ├─ 物品名称
│  ├─ 订单3
│  │  ├─ 卖家
│  │  ├─ 是否成交
│  │  ├─ 价格
│  │  ├─ 物品名称
├─ 副本
│  ├─ 副本名字1
│  │  ├─ 血量
│  │  ├─ 掉落物
│  │  │  ├─ 1
│  │  │  ├─ 2
│  │  │  ├─ 3
│  ├─ 副本名字2
│  │  ├─ 血量
│  │  ├─ 掉落物
│  │  │  ├─ 1
│  │  │  ├─ 2
在环环嵌套的节点,可以存放许多不同的数据。下面,我们将介绍如何对这些节点进行操作。

读取数据库

通过数据.读(路径)读取特定数据库路径的值。其中,“路径”是一个文本数组,每一个文本所对应的节点,都是前一个文本所对应节点的子节点。
读取公会的财富:
var 财富 = 数据.(['公会', '神仙打架俱乐部', '财富'])
假如,一个公会的名称叫做“神仙打架俱乐部”,通过这段代码可以读取该公会的财富。
但是,不同玩家所在的公会是不一样的,需要通过属性.公会读取公会名称,动态的插入到路径中。
读取玩家所在公会的财富:
var 财富 = 数据.(['公会', 属性.公会, '财富'])
其实,就是把'神仙打架俱乐部'换成了属性.公会,将玩家的公会属性,作为数据库目录的一部分。

写入数据库

将公会的储蓄设置为 1000:
数据.(['公会', '神仙打架俱乐部', '储蓄'], 1000)
将『公会』中的『神仙打架俱乐部』中的『储蓄』数据设置为 1000 。
注意写入数据和读出数据的格式差异。读入是数据.读([...]),写入是数据.写([...], 写入值)

修改数据库的数值

可以先读取数据库,修改数值后,再重新写入回原路径。
读取公会的财富,并增加 1:
var 财富 = 数据.(['公会', '神仙打架俱乐部', '财富']) ?? 0

财富 = 财富 + 1
数据.(['公会', '神仙打架俱乐部', '财富'], 财富)
如果之前没有在该路径写入过数据,数据.读将会返回undefined
如果读出来的数据是undefined,则用??后面跟着的值替代。
例如,对于代码 A ?? B,如果 A 的值为 undefined 或 null,则用 B 替代 A 返回。
如果没有使用 ??,而是直接对 undefined 进行运算,会导致值变成 NaN,写入数据库时会报错。

删除数据库的数值

删除一个公会:
数据.删除(['公会', '神仙打架俱乐部'])
注意,这将删除该节点的所有数据,包括它的子节点所含有的数据。

列出某一节点下的所有子节点

查看所有公会:
var 公会列表 = 数据.目录(['公会'])
这将返回一个文本数组,包含所有公会的名字。例如,这里的公会列表的值是['神仙打架俱乐部', '拖延症治疗中心']

查看某一节点是否存在

通过数据.是否存在(路径)判断某个路径下是否有值或其他目录。
查看某个公会是否存在:
var 公会名称 = '神仙打架俱乐部'
if (!数据.是否存在(['公会', 公会名称])) {
  属性.提示文本 = 公会名称 + '不存在!'
  return
}

代码规范

在数据库单个节点中,会对存放的数据进行一些限制。例如,存入数组的长度不能超过 1000 个。需要合理安排数据库的结构,避免在单个节点中存放大量数据,影响性能。