正文
本文将使用一个简单的例子帮助理解EOSIO中的数据持久性。
1. 在你的contract目录下创建addressbook文件夹,并在其中创建addressbook.cpp文件。
cd /Users/yourUserName/Documents/EOS/contracts
mkdir addressbook
cd addressbook
touch addressbook.cpp
2. 在cpp文件中编写一个继承自eosio::contract的addressbook类。
同时,在public方法中继承eosio::contract的构造函数。
#include <eosio/eosio.hpp>
using namespace eosio;
class [[eosio::contract("addressbook")]] addressbook : public eosio::contract {
public:
using contract::contract;
private:
};
3. 添加person表结构。
使用name类型来定义一个叫做key的变量,同时,编写一个叫做primary_key()的方法(返回key的值),于是key就是该结构的主键。
struct person {
name key;
std::string first_name;
std::string last_name;
std::string street;
std::string city;
std::string state;
uint64_t primary_key() const {
return key.value;}
};
4. 配置multi_index表。
typedef eosio::multi_index<"people"_n, person> address_index;
“people”是该表的名称(_n表示为name类型),person是前面定义的结构体,address_index是该类型的类型名(后面将使用其实例化表)。
5. 编写添加修改记录的方法。
[[eosio::action]]
void upsert(name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state) {
require_auth( user ); //只能操作自己的记录,所以需要验证操作的记录是不是自己的。
//multi_index的实例化需要两个参数,code和scope。
//code是拥有该合约的账户,scope是用于逻辑上的划分(目前没什么作用)
address_index addresses(get_self(), get_first_receiver().value);
//创建一个查询,使用f