埋込みレコードの使用

レコード・エントリは様々な型のフィールドを持つことができます。ただし、埋込みレコードはデータが相対的に静的の場合のみ使用してください。一般的に、特に子データセットが大きいかサイズが変更する場合に、埋込みレコードよりも子表が優れた解決策を提供します。

RECORD()文を使用して表フィールドをレコードとして宣言します。

主キーがUIDで2番目のフィールドにレコードを持つシンプルな2つのフィールドの表を定義するには、次のスクリプトを使用します。

CREATE TABLE myTable (
    uid INTEGER,
    myRecord MAP(firstField STRING, secondField INTEGER),
    PRIMARY KEY (uid)
) 

埋込みレコード・フィールドで、CHECKDEFAULTおよびNOT NULL制約はサポートされていません。ただし、これらの制約は埋込みレコードの個々のフィールドには適用できます。詳細は、「フィールド制約」を参照してください。

レコードを書き込むには、Row.putRecord()を使用し、これにより、RecordValueクラス・インスタンスが返されます。次に、レコードにフィールドを書き込むために、RecordValue.put()を使用します。

TableAPI tableH = kvstore.getTableAPI();

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

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

RecordValue rv = row.putRecord("myRecord");
rv.put("firstField", "An embedded record STRING field");
rv.put("secondField", 3388);

tableH.put(row, null, null); 

レコードを読み込むにはRow.get().asRecord()を使用します。これにより、RecordValueクラス・インスタンスが返されます。こうすることで、レコードからフィールドを取得するためにRecordValue.get()を使用できます。取得した値はFieldValueとして返され、これにより、FieldValue.asInteger()などのキャスト・メソッドを使用してカプセル化された値が取得できます。

たとえば、前述の例で作成した埋込みレコードからフィールド値を取得します。

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);

RecordValue rv = row.get("myRecord").asRecord();
FieldValue fv = rv.get("firstField");
System.out.println("firstField: " + fv.asString().get());
fv = rv.get("secondField");
System.out.println("secondField: " + fv.asInteger().get());