Previous Next JavaScript must be enabled to correctly display this content

## Using Maps

All map entries must be of the same type. Regardless of the type of the map's values, its keys are always strings.

The string "[]" is reserved and must not be used for key names.

When you declare a table field as a map, you use the `MAP()` statement. You must also declare the map element's data types.

To define a simple two-field table where the primary key is a UID and the second field contains a map of integers, you use the following DDL statement:

    CREATE TABLE myTable (
        uid INTEGER,
        myMap MAP(INTEGER),
        PRIMARY KEY (uid)
    )

`DEFAULT` and `NOT NULL` constraints are not supported for map fields.

To write the map, use `Row.putMap()`, which returns a `MapValue` class instance. You then use `MapValue.put()` to write elements to the map:

    TableAPI tableH = kvstore.getTableAPI();

    Table myTable = tableH.getTable("myTable");

    Row row = myTable.createRow();
    row.put("uid", 12345);

    MapValue mv = row.putMap("myMap");
    mv.put("field1", 1);
    mv.put("field2", 2);
    mv.put("field3", 3);

    tableH.put(row, null, null);

To read the map, use `Row.get().asMap()`. This returns a `MapValue` class instance. You can then use `MapValue.get()` to retrieve an map value. The retrieved value is returned as a `FieldValue`, which allows you to retrieve the encapsulated value using a cast method such as `FieldValue.asInteger()`.

For example, to retrieve elements from the map created in the previous example:

    TableAPI tableH = kvstore.getTableAPI();

    Table myTable = tableH.getTable("myTable");

    /* Create a primary key for user id 12345 and get a row */
    PrimaryKey key = myTable.createPrimaryKey();
    key.put("uid", 12345);
    Row row = tableH.get(key, null);

    MapValue mv = row.get("testMap").asMap();
    FieldValue fv = mv.get("field3");
    System.out.println("fv: " + fv.asInteger().get());