ChainJoy-春哥带你学区块链EOS技术爱好者EOS开发系列

关于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的权限。

上一篇下一篇

猜你喜欢

热点阅读