Multi_index详解

论坛 期权论坛     
选择匿名的用户   2021-5-28 02:15   22   0
<h3>Multi-Index API 简介</h3>
<p><span style="color:#f33b45;">1、Multi-Index API 是EOS提供的访问数据库的C&#43;&#43;接口,使智能合约能够读取和修改EOS数据库中的数据;</span><br> 2、Multi-Index源文件位置在:eos/contracts/eosiolib/multi_index.hpp;<br> 3、Multi-Index来源于boost库的boost::multi_index,但又有一些重要不同,eos中使用eosio::multi_index;<br><span style="color:#f33b45;">4、eosio::multi_index在概念上和传统数据库的“表(table)”类似,数据“行(rows)”是独立的对象,数据“列(columns)”是对          象的成员属性;</span><br> 5、eosio::multi_index提供和传统数据库的“键(key)”类似的成员属性,用于快速查找对象;<br> 6、eosio::multi_index允许使用自定义函数作为索引,但它的返回值是受限制的,只能是支持的键类型;<br><span style="color:#f33b45;">7、eosio::multi_index支持主键(primary key),但必须是唯一的无符号64位整型(uint64_t);</span><br> 8、eosio::multi_index按主键排序时,使用升序;<br> 9、Multi-Index表允许多索引排序,最多可以使用16个二级索引;<br> 10、Multi-Index迭代器可以双向迭代,即const_iterator或const_reverse_iterator;  <br> 11、二级索引作为Multi-Index表构造函数的一部分创建,不支持直接构建。</p>
<h3>创建Multi-Index表</h3>
<p>1、使用C&#43;&#43;类(class)或结构(struct)定义对象;<br> 2、在class或struct中,定义一个const成员函数:primary_key(),返回uint64_t类型的主键值;<br> 3、确定二级索引(最多支持16个),二级索引不局限于uint64_t,它支持更多类型;</p>
<p><strong><span style="color:#f33b45;">二级索引支持的键类型:</span></strong></p>
<blockquote>
<p><strong>idx64:</strong>64位无符号整型键<br><strong>idx128:</strong>128位无符号整型键<br><strong>idx256:</strong>256位固定大小字典键<br><strong>idx_double:</strong>双精度浮点键<br><strong>idx_long_double:</strong>四倍精度浮点键</p>
</blockquote>
<p><strong>4、为每个二级索引定义extractor,即一个函数,用于从Multi-Index表的函数中获取键,这个函数会被indexed_by(后面会讲)用到。</strong></p>
<p>一个完整的Multi-Index表定义:</p>
<pre class="blockcode"><code class="hljs language-javascript">/定义address表,i64表示索引使用默认的uint64_t类型

//&#64;abi table address i64
struct address {
    uint64_t account;
    string name;
    uint64_t phone;
    uint64_t liked;

    //定义address表的主键
    uint64_t primary_key() const { return account; }
    //定义extractor,二级索引是phone
    uint64_t get_phone() const {return phone; }

    //序列化
    EOSLIB_SERIALIZE(address, (account)(name)(phone)(liked));
};</code></pre>
<h2>如何使用Multi-Index表</h2>
<p><strong>1、实例化Multi-Index表;</strong></p>
<pre class="blockcode"><code class="hljs language-javascript">typedef eosio::multi_index&lt; N(address), address,
            indexed_by&lt;N(phone), const_mem_fun&lt;address, uint64_t, &amp;address::get_phone&gt;&gt;&gt;
    address_index;
   
address_index addresses(_self, _self);
</code></pre>
<p><strong>2、CRUD函数</strong></p>
<blockquote>
<ul><li>增:emplace</li><li>删:erase</li><li>改:modify</li><li>查:get/find</li></ul>
</blockquote>
<h2><a name="t4"></a>类模板</h2>
<p>在multi_index.hpp中,multi_index类的定义使用了<strong>类模板:</strong></p>
<p><img alt="" class="blockcode" height="57" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-e5bc44caad2db77222c7a39c8d240484.png" width="473"></p>
<p>第一个参数是<strong>表名,</strong>第二个参数是<strong>表对象的类型,</strong>其余为可变参数<strong>Indices(二级索引),</strong>二级索引的数量不能超过16个。</p>
<ul><li><strong>表名(TableName)</strong></li></ul>
<blockquote>
<p>multi_index表的名称,最长12个字符,只能由小写字母、数字1-5、“.”组成。</p>
</blockquote>
<ul><li><strong>T</strong></li></ul>
<blockquote>
<p>表对象的类型,即表中“行(row)”的定义。</p>
</blockquote>
<ul><li><strong>Indices</strong></li></ul>
<blockquote>
<ol><li>最多16个二级索引的list;</li><li>每个二级索引必须是默认可构造的class或struct;</li><li>每个二级索引必须在表结构中定义一个常量函数,返回二级索引类型或其引用;</li><li>建议使用eosio::const_mem_fun模板,它是boost::multi_index::const_mem_fun的一个类型别名。<br>  </li></ol>
</blockquote>
<p>使用模板参数的例子:</p>
<pre class="blockcode"><code class="hljs language-javascript">typedef eosio::multi_index&lt; N(address), address,
        indexed_by&lt;N(phone), const_mem_fun&lt;address, uint64_t, &amp;address::
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP