Google App Engine(以降GAE)では、データストアを用いてデータの保存(永続化)を行います。
その方法については、以下の記事でも紹介しました。
・Low Level API でデータストアからデータを取得する
・Low Level APIでGAEのデータストアにアクセスする
データストアには、下図のようにカインド(テーブル)>エンティティー(行・レコード)>プロパティー(列)という単位でデータが保存されています。
上記リンクでも解説していますが、データストアに保存した特定のエンティティーを操作(取得や削除)する際、エンティティーに固有に割り振られたキーを元にエンティティーを取得します。
今回紹介する、setKeysOnly()メソッドはキーのみを取得するため処理が早く、カインドに格納されているエンティティーの数を取得したい場合に無駄なデータを取得してこないため便利です。
また、カインドに格納されている全てのエンティティーのキーを取得できるため、キーを元にエンティティーを一斉削除したい場合などにも使えます。
そこで今回は、データストアに保存したエンティティーのキーを一覧で取得する方法について解説します
それでは続きをどうぞ
Queryを用いてエンティティーのキーのみを取得する
カインド内に格納されているエンティティーのキーを取得するにはQueryクラスを用います。
Queryクラスについては「クエリを用いて検索条件を指定する」の記事が参考になります。
今回は以下のようなカインドをあらかじめ作成しておき、そのキーのみを取得します。
[カインド名:getkey]
以下のソースコードを見て下さい。
QueryKeyServlet.java
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
List propertyList = new ArrayList(); for(Entity entity : pq.asIterable()){ propertyList.add(entity.getProperty("name").toString()); }
以上がカインドに格納されたエンティティーのキーを取得する方法です。
キーを取得できば、それを元にエンティティーの取得や削除を行うことが可能なため、便利な方法です。