前回は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アドレスを受け付けるための設定を加える
[画像のクリックで拡大表示]

 さて、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以外からのアクセスを受け付けてくれません。

この先は会員の登録が必要です。有料会員(月額プラン)は初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら