multi_index功能简介


创建表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() const

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

你可能感兴趣的:(区块链)