数据库操作
用户的属性可以存储每个用户自己的数值。但是,有的时候,我们需要存储其它更复杂的数据。例如,不同玩家之间可能需要共享一些数据,例如公会信息、排行榜数据等。使用数据库,可以将这些数据以树状节点形式存储,方便在多个玩家之间共享和访问。
基本原理
数据库通过类似目录的形式管理和存放数据,每个领域都有一个所有玩家共用的数据库。在数据库中,可以创建任意层级的节点,并在每个节点中存储一个值。
例如,下面这个数据库有三个节点“公会”“市场”“副本”,其中“公会”节点下有名字为公会名称的两个子节点,在这些节点下,还有『财富』『人数』等子节点。
├─ 公会
│ ├─ 神仙打架俱乐部
│ │ ├─ 人数
│ │ ├─ 等级
│ │ ├─ 财富
│ ├─ 拖延症治疗中心
│ │ ├─ 人数
│ │ ├─ 等级
│ │ ├─ 财富
├─ 市场
│ ├─ 订单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 个。需要合理安排数据库的结构,避免在单个节点中存放大量数据,影响性能。