创建表multi_index
1.使用C++类(class)或结构体(struct)定义对象
2.在class或struct中,定义一个const成员函数:primary_key(),返回uint64_t类型的主键值
3.确定二级索引(最多支持16个),二级索引不局限于uint64_t,它支持更多类型
(一).实例化
*首先定义类对象或者结构体定义
/// @abi table
struct STRUCT_NAME{
uint64_t primary_key_name;//主键值唯一不可变
...
uint64_t primary_key()const {return primary_key_name;}
...
};
***创建表结构一定要标注@abi table,不然编译会出错,对于可执行的动作也需要标注///@abi action
*表的创建:
typedef eosio::multi_index
(二)表操作(增删改查)
1.增emplace
const_iterator emplace( unit64_t payer, Lambda&& constructor )
*参数
payer:为新对象使用的存储付费的账户
constructor:lambda函数,可以让新创建的对象就地初始化
*返回值
返回一个新创建的对象的主键迭代器
*前置条件
payer是被当前Action授权的有效账户
2.删erase
*使用主键从表中删除现有对象(两种形式)
const_iterator erase( const_iterator itr )
void erase( const object_type& obj )
*参数
itr:指向待删除对象的迭代器
obj:待删除对象的引用
*返回值
使用itr查找对象时,返回被删除对象之后的对象的指针
3.改modify
*修改表中已存在的对象(两种形式)
void modify( const_iterator itr, uint64_t payer, Lambda&& updater )
void modify( const object_type &obj, uint64_t payer, Lambda&& updater )
*参数
itr:指向待更新对象的迭代器
obj:待更新对象的引用
payer:为更新数据付费的账户,为0表示更新数据的payer和创建时的payer相同
updater:用于更新目标对象的lambda函数
*前置条件
itr指向的对象,或obj引用的对象是存在的
payer是被当前Action授权的有效账户
4.查get/find
*使用主键从表中查询已存在的对象
const object_type& get( uint64_t primary ) const
*返回值
包含指定主键的对象的常量引用
const_iterator find( uint64_t primary ) const
*返回值
返回一个查询到的对象的迭代器
如果没有查询到指定对象,返回一个end迭代器
(三)成员访问
*获取拥有主表的账户名
uint64_t get_code() const
*在code下的范围id(scope id),在该范围内可以找到期望的主表实例
uint64_t get_scope() const
(四)迭代器
1. begin & cbegin
返回指向对象类型的、从最小主键值开始的迭代器
const_iterator begin() const
const_iterator cbegin() const
2.end & cend
返回指向虚拟行的迭代器,代表刚刚过去的最后一行,不能被间接引用;
可以向后推进,不能向前推进。
const_iterator end() const
const_iterator end() const
3.rbegin & crbegin
返回和begin/cbegin类似的,但反向的迭代器
const_iterator rbegin() const
const_iterator crbegin() const
4.rend & crend
返回和end/cend类似的,但反向的迭代器
const_iterator rend() const
const_iterator crend() const
5.lower_bound
查找大于等于给定主键值的对象
const_iterator lower_bound( uint64_t primary ) const
6.upper_bound
查找大于给定主键值的对象
const_iterator upper_bound( uint64_t primary ) const
7.get_index
返回一个适当类型的二级索引
secondary_index get_index
secondary_index get_index
8.iterator_to
返回给定对象的迭代器
const_iterator iterator_to( const object_type& obj ) const
9.indexed_by
indexed_by结构体用于实例化multi_index表的索引
在下载的EOS中的智能合约dice中有相关的调用,可以参考学习一下
//@abi action
void canceloffer( const checksum256& commitment ) {
//获取所提交的对象的二级索引
auto idx = offers.template get_index
auto offer_itr = idx.find( offer::get_commitment(commitment) );
eosio_assert( offer_itr != idx.end(), "offer does not exists" );
eosio_assert( offer_itr->gameid == 0, "unable to cancel offer" );
require_auth( offer_itr->owner );
auto acnt_itr = accounts.find(offer_itr->owner);
accounts.modify(acnt_itr, 0, [&](auto& acnt){
acnt.open_offers--;
acnt.eos_balance += offer_itr->bet;
});
//删除相应的对象数据
idx.erase(offer_itr);
}
(五). 工具函数
available_primary_key
返回一个可用(未使用)的主键值,用于主键严格自增的表,它不会被设置为自定义值
uint64_t available_primary_key() const