亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

EOS入門(mén)指南PART7——如何操作multi_index

用戶84 / 3590人閱讀

摘要:比如,第一張圖中,如果傳入的參數(shù)為,那就可以找出所有為的數(shù)據(jù)了,放入迭代器里。每次小的遍歷結(jié)束是,迭代器,表示繼續(xù)訪問(wèn)迭代器中的下一行。

上一章我們學(xué)習(xí)了對(duì)智能合約開(kāi)發(fā)來(lái)說(shuō)至關(guān)重要的第一步:

知道了RAM、multi_index和EOS數(shù)據(jù)庫(kù)各是什么以及它們之間的關(guān)系;

知道了multi_index是內(nèi)存數(shù)據(jù)庫(kù)的入口;

了解了multi_index內(nèi)部的結(jié)構(gòu)長(zhǎng)什么樣子;

今天這章,主要介紹multi_index的相關(guān)操作,趁機(jī)鞏固一波上一章學(xué)習(xí)到的理論知識(shí)。

摘要

上一章說(shuō)到multi_index的概念——多索引容器,multi_index容器的內(nèi)部結(jié)構(gòu)可以類比成傳統(tǒng)數(shù)據(jù)庫(kù)里的一張表,只不過(guò)這張表只有一列,每一行都是一個(gè)struct結(jié)構(gòu)體。

這一章就要向大家介紹,如何具體使用multi_index。

primary keys

還是上一章中的例子:

multi_index的容器(表)里每一行都是上面的struct結(jié)構(gòu)體,并且都是按照主鍵升序排列。所以每一個(gè)multi_index中會(huì)有一個(gè)默認(rèn)索引,也就是主鍵。如上圖,就是按照主鍵(pkey)升序排列的。

uint64_t primary_key() const { return pkey; }

一般而言,在struct結(jié)構(gòu)體中會(huì)聲明一行獲得主鍵的方法primary_key(),這里定義了主鍵類型為uint64_t,返回結(jié)構(gòu)體中的pkey字段,即pkey這個(gè)字段就是整個(gè)結(jié)構(gòu)體的主鍵。

自定義索引

既然叫multi_index,肯定不只可以根據(jù)主鍵進(jìn)行索引,事實(shí)上,我們還可以自定義索引。例如可以在結(jié)構(gòu)體中定義如下方法:

account_name get_customer() const {
    return customer;
}

這就是我們自定義的索引。仿照之前的primary_key()可以看到,這個(gè)方法返回值的類型為account_name,返回的字段為customer。當(dāng)然自定義的索引并不一定要返回結(jié)構(gòu)體中的某個(gè)字段的變量,也可以將變量之間的運(yùn)算結(jié)果作為索引。

這里先貼上結(jié)構(gòu)體的完整表達(dá),方便下面介紹如何使用多索引:

struct service_struct {
     uint64_t pkey;
     account_name customer;
     Date date;
     uint32_t odometer;
    
    auto primary_key() const {return pkey;}
    account_name get_customer() const {return customer;}
    
    EOSLIB_SERIALIZE(service_struct,( pkey )( customer )( date )( odometer ))
}

typedef eosio::multi_index
    >
> customer_index;

解釋一下,使用上面的方式來(lái)定義索引,eosio::multi_index<...>的參數(shù)解釋如下:

service : multi_index容器的表名(如上圖)

service_struct : 智能合約重定義的struct結(jié)構(gòu)體名稱,也可以理解成表中的一行記錄;

indexed_by<...>

N(bycustomer) : 給索引起個(gè)名字 - bycustomer

const_mem_fun<...> :

account_name : 索引的類型

&service_struct::get_customer:通過(guò)service_struct結(jié)構(gòu)體中的get_customer函數(shù)獲得(索引)

通過(guò)上述表達(dá),就可以再生成一張按customer為索引的表bycustomer(見(jiàn)本文第一張圖)。左邊是按照主鍵索引的原表service,右邊的表就是我們按照customer的索引生成的新表(按customer從小到大進(jìn)行排列),可以看到新表內(nèi)的行內(nèi)容和之前是一行的(見(jiàn)虛線指向原表),只不過(guò)按照customer字段進(jìn)行了重新排列。

這里定義了customer_index類型,這樣以后就可以直接用這個(gè)類型去初始化真正的multi_index表。

迭代器

上一章我們介紹過(guò)迭代器,可以把迭代器想象成一個(gè)電梯,通過(guò)在索引中上下滑動(dòng)來(lái)定位數(shù)據(jù)。接著上面介紹的自定義索引comstomer_index:

account_name customer_acct = eosio::chain::string_to_name(customer_name);
auto cust_itr = customer_index.find(customer_acct);

通過(guò)上述代碼,我們就可以找到bycustomer表中,customer為某個(gè)特定值的所有行(結(jié)構(gòu)體)了。比如,第一張圖中,如果傳入的參數(shù)為"bob",那就可以找出所有customer為bob的數(shù)據(jù)了,放入迭代器里。通過(guò)迭代器就可以逐條獲取我們想要的數(shù)據(jù)信息。

得到了迭代器之后,咱們?cè)賮?lái)看看怎么使用迭代器:

while(cust_itr != service.end() && cust_itr -> customer == customer_acct) {
    // code to execute
    cust_itr++;
}

其中cust_itr != service.end()表示迭代器并沒(méi)有走到service表的結(jié)尾,&&之后也很容易看懂,再篩選customer的值。每次小的遍歷結(jié)束是,迭代器+1,表示繼續(xù)訪問(wèn)迭代器中的下一行。

索引和迭代器如何配合工作

通過(guò)上面的介紹,大家應(yīng)該就可以理清multi_index和迭代器是如何配合工作的:

i通過(guò)multi_index可以得到一張按照特定字段索引的表,再通過(guò)對(duì)索引設(shè)置一些條件,就可以篩選得到一些迭代器,再通過(guò)對(duì)迭代器的遍歷,就可以訪問(wèn)我們想要訪問(wèn)的數(shù)據(jù)了。
multi_index的初始化

上文關(guān)于multi_index多與定義有關(guān),現(xiàn)在終于要開(kāi)始實(shí)例化multi_index了。

multi_index(uint64_t code, uint64_t scope)

在上面的初始化(實(shí)例化)的語(yǔ)句中,可以看到有兩個(gè)參數(shù):

code -擁有這張multi_index表的賬戶,該賬戶擁有對(duì)合約數(shù)據(jù)的讀寫(xiě)權(quán)限;

scope - 用戶賬戶名下的區(qū)域??梢栽赾ode下定義多個(gè)scope,把屬于不同scope的表隔離開(kāi);

這里的code和scope,都是用來(lái)為表建立訪問(wèn)權(quán)限的。

所以要想初始化上面的customer_index,可以使用:

// customer_index 就是之前 typedef 定義的類型
// bycustomer就是新表
// _self就是當(dāng)前調(diào)用方法的賬戶
customer_index bycustomer(_self, _self);
添加 - emplace

這里順便說(shuō)一下find,multi_index使用.find來(lái)查詢,代碼接上往下寫(xiě):

void demo::create(const uint64_t id,
                  const account_name cust_acct,
                  const Date date,
                  const uint32_t odometer) {
    // 找出特定值的customer的數(shù)據(jù)
    // 這里的auto相當(dāng)于其他語(yǔ)言中的var,聲明變量時(shí)不指定類型
    auto itr = bycustomer.find(cust_acct);
    // 查詢customer = cust_acct的記錄并要求該記錄不存在
    // 因?yàn)閜rimary_key不能重復(fù)
    // 所以插數(shù)據(jù)之前先查詢一下,保證不重復(fù)
    eosio_assert(itr == profile.end(), "Account already exists");
    // 往索引里添加記錄
    bycustomer.emplace(cust_acct, [&](auto& c)) {
        c.pkey = id;
        c.customer = cust_acct;
        c.date = date;
        c.odometer = odometer;
    }
}

其中[&](auto& c)是c11之后一種新的lambda表達(dá)式,有興趣的同學(xué)可以自行深入了解,這里簡(jiǎn)單介紹一下,這個(gè)表達(dá)式大概表示:

除了該函數(shù)已有的參數(shù),其他的參數(shù)例如 id, date, odometer這些,都是在上層的作用域中通過(guò)引用的形式傳入函數(shù)內(nèi)。

其中auto我們之前說(shuō)過(guò),表示不限制類型,但是也為引用。

看懂了添加記錄,其他諸如刪、改、查的操作也就不難看懂了,大家可以去官網(wǎng)查看相關(guān)例子:

https://eosio-cpp.readme.io/d...

結(jié)束語(yǔ)

本章我們學(xué)習(xí)了:

如何自定義索引;

如何生成以及使用迭代器;

索引和迭代器是如何配合使用的;

multi_index的相關(guān)操作

希望大家學(xué)完之后可以去官網(wǎng)繼續(xù)補(bǔ)充刪、改、查的相關(guān)例子,以達(dá)到舉一反三的效果。下面幾篇我們將正式了解EOS智能合約開(kāi)發(fā)的二三事。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/24222.html

相關(guān)文章

  • EOS入門(mén)指南PART6——?jiǎng)e忙著開(kāi)發(fā),先來(lái)看看智能合約數(shù)據(jù)是怎么存的

    摘要:允許智能合約定義自己的私有數(shù)據(jù)庫(kù)表。有了多級(jí)索引,智能合約就具備了操作類似數(shù)據(jù)庫(kù)模塊的功能。因此雖然只有一列,但是的靈活性絲毫不亞于傳統(tǒng)的數(shù)據(jù)表。 上一章我們學(xué)習(xí)了開(kāi)發(fā)智能合約之前需要知道的必要概念: 什么是webAssembly以及它在智能合約上下游中的位置; 什么是ABI以及怎樣使用eosiocpp工具產(chǎn)生ABI和wasm、wast hello智能合約的簡(jiǎn)單入門(mén):部署和調(diào)用 ...

    ranwu 評(píng)論0 收藏0
  • EOS入門(mén)指南PART8——智能合約入門(mén)實(shí)戰(zhàn)

    摘要:這里的是封裝的,返回中,當(dāng)前索引的迭代器之后遍歷該迭代器,就可以獲得所有某個(gè)特定值的所有數(shù)據(jù)。 上一章我們細(xì)致地學(xué)習(xí)了 索引和迭代器的關(guān)系; 如何生成和使用索引以及迭代器 介紹了multi_index的相關(guān)操作 相信大家對(duì)multi_index已經(jīng)有了比較全面的理論理解以及掌握了一些基礎(chǔ)的操作。這一章將會(huì)教大家如何完整地構(gòu)建一個(gè)智能合約,并在合約中直觀地操作multi_inde...

    Sike 評(píng)論0 收藏0
  • EOS開(kāi)發(fā)中的數(shù)據(jù)持久性問(wèn)題(上)

    摘要:需要對(duì)構(gòu)造函數(shù)進(jìn)行命名和配置,以使用我們之前定義的結(jié)構(gòu)。我們的構(gòu)造函數(shù)傳遞的范圍參數(shù)是正在部署合約的區(qū)塊鏈上的帳戶。此方法接受兩個(gè)參數(shù),即此記錄的范圍和回調(diào)函數(shù)?;卣{(diào)函數(shù)用于處理表的修改。但是如果用戶想要完全刪除記錄呢請(qǐng)看的數(shù)據(jù)持久性下。 本教程假定你已經(jīng)完成了EOS開(kāi)發(fā)從智能合約開(kāi)始。 要了解數(shù)據(jù)持久性,請(qǐng)編寫(xiě)一個(gè)簡(jiǎn)單的智能合約,作為地址記錄。雖然這個(gè)用例由于各種原因而不太適合作為生...

    cikenerd 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<