前回はDatastoreのCRUD処理を学びました。AndroidとApp Engine共に「カレー店データベース」を題材に説明してきました。せっかくなので、最近はやりの「スマートフォン+クラウド」の構成も試してみましょう。ここでは、
・店情報(SHOP)は固定
・店ごとのメモ(MEMO)をサーバー側と同期する
の2点を実装条件とします。必要な機能は、(1)Androidからメモ情報をURL「/memo」にPOSTリクエストする、(2)Androidアプリからメモ情報をURL「/memo」にGETリクエストする、の2点です。

メモのPOSTを処理する(App Engine側)

 まずは、App Engine側にPOSTリクエストを受け取るMemoServletクラスを新規作成して、前回のリスト2と同様にHttpServletクラスのdoPostメソッドをオーバーライドします。そして、メソッド内にリスト9を記述します。ShopServletクラスのdoPostと似た実装です。このサーブレットを利用して、AndroidからPOSTされたメモ情報を表示します。

 リスト9では、MEMOエンティティ用のプロパティ値がPOSTされるので、それを使ってMEMOエンティティを組み立てています。この変更に合わせて、web.xmlに「/memo」へアクセスがあった場合にMemoServletクラスが割り当てられるように定義を追加します(リスト10)。

メモをPOSTする(Android側)

 続いて、Android側の処理を実装します。Androidでは、ネットワークにアクセスすることを宣言しなければなりません。まずは、AndroidManifest.xmlに
<uses-permission android:name=
!android.permission.INTERNET! />
を最後の</manifest>の閉じタグのすぐ上に追加します。これは、Androidアプリケーションでインターネット接続を許可するために必要な設定です。

 AndroidのSQLiteにあるMEMOテーブルから全件を読み出し、それを1件ずつApp Engineに投げていきます。Androidには、標準でApache HttpComponentsコンポーネントが含まれているので、これを利用して通信します。

 MemoDao.javaにリスト11のgetAllメソッドを追加します。Part2で説明したので詳細は割愛しますが、MEMOテーブルからすべてのデータを引き出すメソッドです。そして、net.vvakame.currydbパッケージにリスト12のAppengineSyncクラスを作成します。

 (1)で、「http://アップロード先のIPアドレス+ポート番号/memo」を指定します。クラウド環境のApp Engineを利用する場合は、デプロイ先のURLを記述してください。ローカル環境で指定する場合は、「http://192.168.0.5:8888/memo」などと記述します。(2)でCurryDbHelperのインスタンスを生成し、(3)でdbオブジェクトを取得します。(4)でMEMOテーブルからすべてのデータを取得して、(5)のpostメソッドによってデータを1件ずつ送信します。

図11●数字によるIPアドレスを受け付けるための設定を加える
図11●数字によるIPアドレスを受け付けるための設定を加える
[画像のクリックで拡大表示]

 さて、Android側からApp Engineの開発サーバーへ接続するに当たって、注意点があります。Android側からApp Engine開発サーバーへ接続するには「開発マシンのIPアドレス」でアクセスする必要があります。その際、App Engine開発サーバーの起動オプションを変更しなければなりません。

 Eclipseのメニューから「Run」→「Run Configurations」を開き、左側のパネルから「Web Application」→「CurryServer」を選択します。「Arguments」タブを開き、「Program arguments」の欄の先頭に「--address=0.0.0.0」を追加して、「Apply」ボタンをクリックします(図11)。この設定がないと、開発サーバーはlocalhost以外からのアクセスを受け付けてくれません。