2013 年 5 月 11 日

話題のParseのandroid SDKを使ってみた

話題のParseのandroid SDKを使ってみた

[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;
	}

サーバの設定やデータベースの定義なども全く必要ありません。これでアプリの開発に専念できるというわけですね。アプリのアクセスが増えても、サーバやネットワークの増強も簡単にできそうです。しかし、そんな人気アプリが開発できるかということが、私には問題です(笑)。