基本步骤在智能合约里与 EOS 数据库交互,首先要定义存储的数据: 定义对象:具体就是定义一个 C++ 类或者 C++ 结构体,数据表就由一个个对象组成。 存储数据定义好之后,就可以与数据库交互了: 建立数据表:实例化 multi_index,建立数据表。 需求分析我们参考 EOS 的官方示例,建立一个“汽车修理店”智能合约所需要的数据库。数据库服务的对象是维修技师和车主。每次车辆维修保养后,维修技师都可以添加本次维修服务的信息,可以更科学地管理每位客户的车辆维修保养服务。而且维修技师和车主都可以更新车辆目前的里程,以便技师确定车辆是否应该保养。我们需要一个数据表:维修数据表(service Table)。 建立数据对象维修数据表中,每一条数据对象就是一次车辆维修保养的数据,包含以下成员: 主键:因为数据表主键必须是唯一的,所以无法用顾客的账户名作为主键(同一个顾客有多条维修记录)。这里我们让系统自动生成主键。 我们还想方便的查询每个顾客的维修记录,所以需要一个以顾客账户名为键(Key)的索引。 这样我们就得到了 service_rec 结构体:
建立数据表下面就可以建立数据表了,首先,multi_index是个模板类:(对 C++ 模板不熟悉的可以百度一下)
我们需要填入以下multi_index的模板参数: TableName为数据表名称,12字符以内,只能使用小写字母,数字1-5,小数点“.”。 按照需求,我们这样设置multi_index的模板参数:
这里并没有实例化multi_index,只是将填入相应模板参数的multi_index设置了一个别名:service_table_type。依然,对这里的做法不熟悉的可以看一下 C++ 模板类以及 C++ 的 using 关键字。 下面我们实例化multi_index,构造函数需要两个参数:
其中,code为数据表的拥有者,scope为数据表的细分名称。这里有两种理解,一种理解是不同的 scope 就是不同的数据表,也就是说,在同一个账户下,存在着TableName相同的多个数据表,他们的scope互不相同;另一种理解:scope表示了同一个数据表的不同部分,互相独立读写。这两种理解的结果是一样的,就是唯一确定一个数据表需要三个参数:TableName,code,scope。 实例化multi_index:
上面的code = current_receiver(),表示当前的智能合约,即“汽车维修店合约”。如果这里的code为其他合约,那么说明这个multi_index指向了其他账户名下的数据表,在本合约中就只能进行读取操作了。scope = mechanic表明实例化的这个multi_index指向了细分名称为mechanic(以维修技师账户命名)的数据表。 我们所建立的数据表结构如下图所示。 操作数据一般数据库的基本操作是增、删、改、查,EOS 数据库当然也具有这些功能。 新增数据 新增数据需要用到multi_index的emplace方法:
其中的payer参数位储存空间支付账户,也就是由谁来提供新加入的这个数据对象的存储空间,这里填入维修技师mechanic账户。constructor是个 Lambda 表达式,也叫匿名函数,是向emplace方法传入了一个构造函数,用来构造这个新的数据对象。
其中的customer_name、service_date、odometer要在实际开发时使用有意义的变量。 查询数据 由于service_table数据表的主键是没有意义的,所以我们需要使用bycustomer索引来根据顾客账户名(customer)查询数据。
这样我们就得到了bycustomer索引,我们可以使用索引的find方法来按照索引查找特定customer的数据对象。 //建立要查找的账户,注意这里的customer_name要使用有意义的字符串
//使用
如果没有查找到,cust_itr(迭代器)就是service_table.end(),也就是搜索到最后也没有找到对应的数据。如果查找成功,cust_itr(迭代器)就会指向所需的数据对象。 之后,可以使用下面的代码可以遍历数据表中所有我们所需的条目。(因为顾客账户名不是唯一的,用find方法会找到符合条件的第一条数据) while (cust_itr != service_table.end() /<-判断迭代器位置/&& cust_itr->customer == customer_acct/<-判断数据是否符合/) {
} 修改数据 在迭代器指向数据后,可以对数据进行修改,使用modify方法: service_table.modify(cust_itr,/<-迭代器/, mechanic, /<-储存空间支付账户/ [&]( auto& s_rec )/<-匿名函数/
匿名函数中的new_customer、new_service_date、new_odometer请使用有意义的变量。也可以只修改其中部分变量。 删除数据 在迭代器指向数据后,可以对数据进行删除,使用erase方法:
至此,带领大家了初步解了 EOS 数据库开发的思路与方法,EOS 数据库还有很多 API 可以供智能合约使用, —- 编译者/作者:流浪诗人 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
EOS 数据库与持久化 API(二)
2020-01-01 流浪诗人 来源:区块链网络
LOADING...
相关阅读:
- 特拉维夫证券交易所推出区块链平台2020-08-03
- CoinBer合约强制平仓说明2020-08-03
- 币海蓝天:8.3比特币晚间行情分析BTC持续横盘,迟迟不动是否有大动作?2020-08-03
- 币圈策略师:8.3比特币行情分析大跌过后震荡区间对待2020-08-03
- 比特币的疯狂周末让人想起2017年的公牛拉力赛,“2020年更高的未来2020-08-03