关于EOS合约开发中Table查询的问题
2018-08-10 本文已影响5人
北冥Master
EOS合约开发中,想要查询Table中的数据,有以下两种方式:
1 通过合约方法查询
my_index contents(_self, _self);
auto iter = contents.find(id);
print(iter->name);
可自定义查询字段,精确控制返回结果。
2 通过通用命令查询
cleos get table contract acount table
contract:合约名称
account:合约账户
table:表名
也可以根据id和key来查询,其他参数看命令Help。
不带其他参数得到如下类似结果:
{
"rows": [{
"id": 0,
"author_account_name": 1,
"owner_account_name": 2,
"content_": "",
"hash": "",
"version": 3,
"register_time": 4,
"reprint_copyright_price": 5,
"full_copyright_price": 6
}
],
"more": false
}
不过这种查询方式需要检查你的abi文件里面,tables这个字段是否有值,否则会报如下错误:
Error 3060003: Contract Table Query Exception
Most likely, the given table doesn't exist in the blockchain.
意思就是找不到表名。
abi文件关于tables定义部分类似如下:
"tables": [{
"name": "content",
"index_type": "i64",
"key_names": [
"id",
"author_account_name"
],
"key_types": [
"uint32",
"uint64"
],
"type": "content"
}]
表名定义需要使用 @abi table table_name i64 注解,写在struct结构体定义的上面一行。
如果没有,abi文件中的tables将是空值,也可在生成abi文件以后,手工添加。
@abi table table_name i64注解类似如下:
//@abi table content i64
struct content{
uint32_t id;
uint64_t author_account_name;
uint64_t owner_account_name;
string content;
string hash;
uint64_t version;
uint32_t primary_key() const{return id;}
EOSLIB_SERIALIZE(content, (id)(author_account_name)(owner_account_name)(content)(hash) (version))
};
这样你就能愉快的使用cleos get table命令来查询任何table的数据了,当然你需要有相应table的权限。