[Parse]
Parseはモバイル用BaaS(Backend as Service)を提供していますが、今回、Webホスティングサービスもリリースされました。Cloud Codeというサービスで、Javascript SDKを使ったJavascriptアプリをParse Cloudで動作させることができます。
もちろん、htmlや画像などもアップロードすることができます。使い方はHerokuと似た感じで利用できそうです(Webホスティングはファイル容量は10MBで、ファイル数は500filesまでとなっています)。
今回は、BaaSで提供されているAndroid SDK(他にiOS,OSx,Android,JavaScript,.NET用が用意されています)を使って、アンドロイドアプリから、Parseの使い方をご紹介します。SDK以外に、他にREST APIやPush Notificationも用意されていて、モバイルアプリの開発をサポートしてくれます。
サインイン
プランは、Basic(無料),Pro(有料:フリートライアル有),Enterprise(有料)が用意されています。Basicプランは、リクエストが100万/月、プッシュが100万回/月、20リクエスト/秒という制限があります。
サインインやログインの画面も、わかりやすくて美しいです。今回は、Basicプランで試してみます。FacebookやGithubのアカウントからもサインインすることができます。
サインインとともに、アプリを作成します。ダッシュボードへ行くと、現在のアプリのリソース使用量がわかるようになっています。
SDKダウンロード
SDKダウンロードページから、Android SDKをダウンロードします。サンプルのExample Appもあわせてダウンロードしましたが、サンプルのlibsにはSDKのライブラリが既に存在していたので、サンプルだけでも動作します。
サンプルを実行
Example AppはToDoアプリのサンプルのようです。まず、ToDoListApplicationのParse.initializeに自分のアプリキーとクライアントキーを設定します。
public class ToDoListApplication extends Application { @Override public void onCreate() { super.onCreate(); Parse.initialize(this, "Uh14zSYAMz81mLPMOcMNXMWXw8W8UeYKWRgpRlVk", "PpppcrUpBnTd0pjpOjFaCFLh9Nc8WGVkcUDg3aIG"); ParseUser.enableAutomaticUser(); ParseACL defaultACL = new ParseACL(); // Optionally enable public read access. // defaultACL.setPublicReadAccess(true); ParseACL.setDefaultACL(defaultACL, true); } }
アプリケーションキーとクライアントキーは、ダッシュボードのアプリの右上のギア(歯車)アイコンをクリックして、以下のページで見ることができます。
このサンプルを実行すると、以下のような画面が表示され、メニューからAdd ToDoを選択すると、タスクを登録することができます。
ParseObject
このToDoのデータはParseのクラウドデータベース(mongodb)にParseObjectとして保存されています。ParseObjectはkey-val形式でJSONと互換性を持つオブジェクトです。このデータベースはNonSQLデータベースでスキーマレスです。
ParseのダッシュボードのData Browserで、さきほど登録したToDoの内容を見ることができます。
アンドロイドアプリからParseObjectの登録
では、アンドロイドアプリからどのようにして、ParseObjectを登録しているのか、ソースコードを見てみます。
ToDoListActivityのonActivityResultで、ParseObjectを登録しているコードがあります。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (intent == null) { return; } final Bundle extras = intent.getExtras(); switch (requestCode) { case ACTIVITY_CREATE: new RemoteDataTask() { protected Void doInBackground(Void... params) { String name = extras.getString("name"); ParseObject todo = new ParseObject("Todo"); todo.put("name", name); try { todo.save(); } catch (ParseException e) { } super.doInBackground(); return null; } }.execute(); break; case ACTIVITY_EDIT: // Edit the remote object final ParseObject todo; todo = todos.get(extras.getInt("position")); todo.put("name", extras.getString("name")); new RemoteDataTask() { protected Void doInBackground(Void... params) { try { todo.save(); } catch (ParseException e) { } super.doInBackground(); return null; } }.execute(); break; } }
HTTP通信があるので、バックグランドで処理します。ParseObjectを生成して、name属性に入力した内容が保存されて、Parseのデータベースに保存されています。
参考リソース:Parse Android API
case ACTIVITY_CREATE: new RemoteDataTask() { protected Void doInBackground(Void... params) { String name = extras.getString("name"); ParseObject todo = new ParseObject("Todo"); // TodoクラスのParseObjectインスタンスを生成 todo.put("name", name); // name属性に入力したToDoを設定 try { todo.save(); // インスタンスを保存 } catch (ParseException e) { } super.doInBackground(); return null; } }.execute(); break;
オブジェクトの検索
目的のオブジェクトを検索するには、ParseQueryクラスが利用できます。
private List<ParseObject> todos; protected Void doInBackground(Void... params) { // Gets the current list of todos in sorted order ParseQuery query = new ParseQuery("Todo"); // Todoクラスのクエリーを生成 query.orderByDescending("_created_at"); // ソート順を生成日時の降順に指定 try { todos = query.find(); // 検索を実行 } catch (ParseException e) { } return null; }
サーバの設定やデータベースの定義なども全く必要ありません。これでアプリの開発に専念できるというわけですね。アプリのアクセスが増えても、サーバやネットワークの増強も簡単にできそうです。しかし、そんな人気アプリが開発できるかということが、私には問題です(笑)。