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


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

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