Here is an example from the eosio.cdt Gitbook:
#include <eosiolib/eosio.hpp>
using namespace eosio;
class mycontract: contract {
struct record {
uint64_t primary;
uint64_t secondary_1;
uint128_t secondary_2;
checksum256 secondary_3;
double secondary_4;
long double secondary_5;
uint64_t primary_key() const { return primary; }
uint64_t get_secondary_1() const { return secondary_1; }
uint128_t get_secondary_2() const { return secondary_2; }
checksum256 get_secondary_3() const { return secondary_3; }
double get_secondary_4() const { return secondary_4; }
long double get_secondary_5() const { return secondary_5; }
};
public:
mycontract(name receiver, name code, datastream<const char*> ds):contract(receiver, code, ds){}
void myaction() {
auto code = _self;
auto scope = _self;
multi_index<"mytable"_n, record,
indexed_by< "bysecondary1"_n, const_mem_fun<record, uint64_t, &record::get_secondary_1> >,
indexed_by< "bysecondary2"_n, const_mem_fun<record, uint128_t, &record::get_secondary_2> >,
indexed_by< "bysecondary3"_n, const_mem_fun<record, checksum256, &record::get_secondary_3> >,
indexed_by< "bysecondary4"_n, const_mem_fun<record, double, &record::get_secondary_4> >,
indexed_by< "bysecondary5"_n, const_mem_fun<record, long double, &record::get_secondary_5> >
> table( code, scope);
}
}
EOSIO_DISPATCH( mycontract, (myaction) )
You then use the get_index
function, described as:
Returns an appropriately typed Secondary Index.
Template parameters:
IndexName - the ID of the desired secondary index Returns:
An index of the appropriate type: Primitive 64-bit unsigned integer
key (idx64), Primitive 128-bit unsigned integer key (idx128), 128-bit
fixed-size lexicographical key (idx128), 256-bit fixed-size
lexicographical key (idx256), Floating point key, Double precision
floating point key, Long Double (quadruple) precision floating point
key
Example:
#include <eosiolib/eosio.hpp>
using namespace eosio;
using namespace std;
class addressbook: contract {
struct address {
uint64_t account_name;
string first_name;
string last_name;
string street;
string city;
string state;
uint32_t zip = 0;
uint64_t primary_key() const { return account_name; }
uint64_t by_zip() const { return zip; }
};
public:
addressbook(name receiver, name code, datastream<const char*> ds):contract(receiver, code, ds) {}
typedef eosio::multi_index< name("address"), address, indexed_by< name("zip"), const_mem_fun<address, uint64_t, &address::by_zip> > address_index;
void myaction() {
// create reference to address_index - see emplace example below
// add dan account to table - see emplace example below
uint32_t zipnumb = 93446;
auto zip_index = addresses.get_index<name("zip")>(); // <-- THIS IS THE LINE
auto itr = zip_index.find(zipnumb);
eosio::check(itr->account_name == name("dan"), "Lock arf, Incorrect Record ");
}
}
EOSIO_DISPATCH( addressbook, (myaction) )