データストアに保存したエンティティーのキーを取得する


Google App Engine(以降GAE)では、データストアを用いてデータの保存(永続化)を行います。
その方法については、以下の記事でも紹介しました。

Low Level API でデータストアからデータを取得する
Low Level APIでGAEのデータストアにアクセスする

データストアには、下図のようにカインド(テーブル)>エンティティー(行・レコード)>プロパティー(列)という単位でデータが保存されています。

上記リンクでも解説していますが、データストアに保存した特定のエンティティーを操作(取得や削除)する際、エンティティーに固有に割り振られたキーを元にエンティティーを取得します。

今回紹介する、setKeysOnly()メソッドはキーのみを取得するため処理が早く、カインドに格納されているエンティティーの数を取得したい場合に無駄なデータを取得してこないため便利です。
また、カインドに格納されている全てのエンティティーのキーを取得できるため、キーを元にエンティティーを一斉削除したい場合などにも使えます。
そこで今回は、データストアに保存したエンティティーのキーを一覧で取得する方法について解説します

それでは続きをどうぞ

Queryを用いてエンティティーのキーのみを取得する

カインド内に格納されているエンティティーのキーを取得するにはQueryクラスを用います。
Queryクラスについては「クエリを用いて検索条件を指定する」の記事が参考になります。

今回は以下のようなカインドをあらかじめ作成しておき、そのキーのみを取得します。

[カインド名:getkey]

以下のソースコードを見て下さい。

QueryKeyServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class QueryKeyServlet extends HttpServlet {
 
    DatastoreService dss = DatastoreServiceFactory.getDatastoreService();
 
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws IOException {
        Velocity.init();
 
        Query query = new Query("getkey");
        query.setKeysOnly();
        PreparedQuery pq = dss.prepare(query);
        List keyList = new ArrayList();
 
        for(Entity entity : pq.asIterable()){
            // 取り出したエンティティーからキーを取得する
            keyList.add(entity.getKey());
        }
        VelocityContext vc = new VelocityContext();
        vc.put("keyList", keyList);
 
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
 
        Template template = Velocity.getTemplate("WEB-INF/resultdisp.vm", "Shift-JIS");
        template.merge(vc, resp.getWriter());
    }
}

9行目で、キーを取得したいエンティティーが格納されているカインド名を引数に、Queryクラスのインスタンスを生成しています。
10行目で、QueryクラスのsetKeysOnly()メソッドを用いて、キーのみを取得したいことを示します。
後は14行目〜17行目取得したエンティティーからキーを取得し、配列に格納しています。
キーの取得はEntityクラスのgetkey()メソッドで行います。
最後に18行目〜25行目で、取得したキーをブラウザで表示します。ブラウザでの表示にはVelocityを使用しています(「テンプレートを利用してブラウザに表示する」参照)。
すると下図のように、エンティティーに割り当てられたキーが表示されます。

ちなみにエンティティーのキーは、「カインド名(id)」の形式で取得できます。

なお以下のように、取得したエンティティーからキー以外のプロパティー(今回の場合は”name”)を指定して取得しようとした場合、NullPointerExceptionとなり取得できません。つまりキー以外は取得できていないことがわかります。

QueryKeyServlet.java

1
2
3
4
List propertyList = new ArrayList();
for(Entity entity : pq.asIterable()){
    propertyList.add(entity.getProperty("name").toString());
}

以上がカインドに格納されたエンティティーのキーを取得する方法です。
キーを取得できば、それを元にエンティティーの取得や削除を行うことが可能なため、便利な方法です。