主要索引
到目前为止,您应该知道如何使用struct在EOS中定义多索引表,但为了完整起见,我们简要介绍一下我们的基本表定义。
我们将首先定义我们struct
及它所需的primary_key
函数,这是我们调用时使用的索引find(KEY)
。现在让我们使用用户account_name
的独特性,并在下一章中介绍一种更通用的方法。
// @abi table items i64
struct Item {
account_name id;
string name;
uint64_t attack;
account_name owner;
auto primary_key() const { return id; };
EOSLIB_SERIALIZE(Item, (id)(name)(attack)(owner));
};
现在我们已经声明了我们的struct。我们可以使用multi_index<TABLE_NAME, TABLE_STRUCT>
EOS库中的方法定义我们的多索引表;
typedef multi_index<N(items), Item> items_table;
- 在我们之后
typedef
,我们可以简单地定义一个引用,然后在我们的构造函数中初始化我们的表,或者我们可以根据需要在每个函数中初始化一个引用。
二级索引
让我们通过添加二级索引来扩展我们表的功能,以便各自所有者获取项目。我们的Item
结构现在看起来像这样:
// @abi table items i64
struct Item {
auto id;
string name;
uint64_t attack;
account_name owner;
auto primary_key() const { return id; };
uint64_t get_owner() const { return owner; };
EOSLIB_SERIALIZE(Item, (id)(name)(attack)(owner));
};
- 我在索引
primary_key
下面添加一行unit64_t get_owner() const { return owner; };
。此函数只返回owner
调用时的值。
让我们在多索引表中将其定义为二级索引,以便我们以后可以访问它;
typedef multi_index<N(items), Item, indexed_by<N(byowner), const_mem_fun<Item, uint64_t, &Item::get_owner>>> item_table;
- 不要让上面的代码吓到你,这只是我们之前的声明,还有一个额外的论点。
indexed_by<N(byowner), const_mem_fun<Item, uint64_t, &Item::get_owner>>
- 这是定义我们的二级索引的代码。我们使用
indexed_by<INDEX_NAME, LOOKUP_FUNCTION_DEFINITION>
来指定索引byowner
。 - INDEX_NAME; 可以是你喜欢的任何东西,不需要在语法上匹配我们的函数
get_owner
,只需记住它是我们将在后面的操作中用来访问二级索引的名称。 - LOOKUP_FUNCTION_DEFINITION:
cons_mem_fun<STRUCT, RETURN_VALUE, LOOKUP_FUNCTION>
在我们的示例中看起来像构造我们的二级索引函数并将其分配给我们的索引定义的函数。
所以我们已经为我们的项目编写了索引owner
,但是我们如何使用索引来查找特定用户拥有的项目?为此我们将步入一个动作并使用多索引表方法get_index<INDEX_NAME>()
,让我们创建一个名为inventory
获取用户项的动作。
// @abi action
void inventory(const account_name account) {
item_table items(_self, _self);
auto playerItems = items.get_index<N(byowner)>();
auto iter = playerItems.lower_bound(account);
while (iter != playerItems.end()) {
print("Item ", iter->name);
iter++;
}
}
让我们突破以下几行,深入研究它的责任;
auto playerItems = items.get_index<N(byowner)>();
- 这一行使用
get_index
我们item_table
实例的函数来获取我们之前定义的索引。请注意,我们使用N(byowner)
前面指定的相同名称来引用我们正在寻找的索引。
这是二级索引,现在我们有了索引,我们可以执行通常使用primary_index执行的所有功能。在这个例子中,我们使用lower_bound
,您也可以使用find
,get
,upper_bound
,begin
,或end
以满足您的特定用例。