データストアって何?

データベースのようなもの



使い方 〜格納するクラスの作り方〜

簡単に言うと、クラスにアノテーションとKeyクラスのフィールドをちょっと加えるだけです。


SQLを使うDBではないので、DBの作成にSQLは不要です。
データストアではクラスにちょっとアノテーションを付けるだけで格納できます。ね、簡単でしょ。


まずはデータストアに格納するクラスを作ります。
例を以下に示します。

@PersistenceCapable(identityType = IdentityType.APPLICATION) //必須のおまじない。Eclipseで自動でインポートできない時があるので注意
public class TestBean
{
	@PrimaryKey //主キー。ここの値でデータを一意な値として認識する
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) //システムが自動で値を割り振るおまじない
	private Key messageId; //主キーのクラスはcom.google.appengine.api.datastore.Keyを使用する
	
	@Persistent //主キーではないけど、データストアに格納したい値
	private String message;
	
	//ただのゲッター。メソッドにはアノテーションは不要
	public String getMessage()
	{
		return message;
	}

	//ただのセッター。メソッドにはアノテーションは不要
	public void setMessage(String s)
	{
		message = s;
	}
}

DataViewerで見た限りではデータはRDBと同じ状態で格納されるようです。
カラム名は@PrimaryKeyや@Persistentをつけたフィールド名と同じです。



使い方 〜データを格納する〜

public class TestServlet extends HttpServlet
{
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException
	{
		try
		{
			//データ作成
			TestBean bean = new TestBean();
			bean.setMessage("test");
			
			//データをデータストアへ格納
			PersistenceManagerFactory factory = 	JDOHelper.getPersistenceManagerFactory("transactions-optional");
			PersistenceManager pm = factory.getPersistenceManager();
			
			Transaction t = pm.currentTransaction();
			t.begin(); //トランザクションの開始
			pm.makePersistent(bean); //データを格納
			t.commit(); //コミット
			
			//データストアからデータを取得
			Query q = pm.newQuery(TestBean.class);
			@SuppressWarnings("unchecked")
			List<TestBean> print = (List<TestBean>)q.execute(); //データストアに格納されている全てのデータを取得
			
			for(TestBean test : print) resp.getWriter().println(test.getMessage()); //表示
			
			pm.close();
		}
		catch(Exception e)
		{
			resp.getWriter().println(e.getMessage());
		}
	}
}

ここら辺は詳しく理解していませんが、とりあえず上記の例を実行すればデータストアにデータが入ります。
こんな風に↓


以上です。暇を見つけてメソッドの詳細についても書いていくつもりです。



データの格納2

PersistenceManager manager = factory.getPersistenceManager();

try
{
	manager.makePersistent(id);
}
finally
{
	manager.close();
}

データの更新

PersistenceManager.getObjectById()で値を取得する。
PersistenceManagerのclose()を実行する前にgetObjectById()で取得した値を書き換え、makePersistent()を使って格納しなおす。

PersistenceManager manager = factory.getPersistenceManager();
Test test = manager.getObjectById(Test.class, test.getKey());

try
{
	test.set(〜);
	manager.makePersistent(test);
}
finally
{
	manager.close();
}