Android アプリケーション向けのクラウド・ベースのサービス Parse

クラウドで Android アプリケーションのユーザー、データ・オブジェクト、ファイルを保存および照会する

Android 向け Parse SDK を紹介するこの記事で、モバイル・アプリケーションのデータをプライベート・クラウドに保存する利点を探ってください。モバイリストの C. Enrique Ortiz が、モバイル・アプリケーションのユーザー、データ・オブジェクト、そしてファイルをクラウドに保存して操作するための Parse API クラスを紹介します。

C. Enrique Ortiz, Mobile Technologist, Independent

C. Enrique Ortiz は、スマートフォンがスマートになる前からエンド・ツー・エンドのモバイル・ソフトウェアを作成している年季の入ったモバイリスト、著者、そしてブロガーです。モバイル・ソフトウェア開発に関する数多くの技術記事と 2 冊の本の著者であり、数々の企業でモバイル・コンピューティングのニーズを支援してきました。


developerWorks 貢献著者レベル

2012年 12月 20日

モバイル向け Parse SDK は、iOS、Android、および Windows アプリケーション用のクラウド・ベースの API とサービスを提供します。さらに、Parse SDK には JavaScript および REST API も用意されています。Parse API を使用すれば、モバイル・アプリケーションを最小限の作業で極めて迅速にクラウド対応のアプリケーションにすることができます。Parse API を統合したモバイル・アプリケーションでは、データ・オブジェクトとファイルを簡単に Parse クラウドに保存できるようになります。また、プッシュ通知の送信およびリッスン、ユーザーの管理、ジオ・ロケーション・データの処理、Twitter や Facebook などのソーシャル・メディア・プラットフォームの使用にも容易に対応することができます。Parse SDK は、スケーリングする必要があるモバイル・アプリケーションにクラウド・プラットフォームが持つありとあらゆる弾力性をもたらします。

始める前に

この記事では、読者が JSON、Android、および Eclipse でモバイル・アプリケーションをプログラミングするために必要な基本概念を理解していることを前提とします。記事の本題に進む前に、Parse.com にアクセスして、対象とするアプリケーションを定義してください。それにはサインアップ・ページから単純な手順に従ってください。

この記事では、Parse ユーザー、データ・オブジェクト、およびファイルのコアとなる Parse API クラスを紹介します。アクセス制御リスト (Access Control List: ACL) を扱う方法、データ・オブジェクトに対して CRUD 操作を実行する方法、そして Parse クラウドでファイルを保存および取得する方法を学んでください。記事に記載するサンプル・コードは、Android 用 Parse SDK (「参考文献」を参照) を使って作成しています。

Parse ダッシュボード

開発者は、Parse ダッシュボードを使用してアプリケーションを管理することができます。このダッシュボードは、API とファイルおよびプッシュ通知に関して、一般的な使用状況のメトリックやアプリケーションに特有の使用状況のメトリックを提供します。アプリケーションのキーと設定は、ダッシュボードから管理します。さらに、このダッシュボードが提供するデータ・ブラウザーでは、保存されている Parse オブジェクトを開発者が参照できるだけでなく、編集することもできます。このデータ・ブラウザーは、デバッグの際に大いに役立ちます。図 1 に、Parse ダッシュボードのスクリーン・ショットを示します。

図 1. Parse ダッシュボード
Parse ダッシュボードのスクリーン・ショット

アプリケーションの認証手段となるのは、アプリケーション ID とクライアント ID です。アプリケーション ID とクライアント ID を入手するには、Parse ダッシュボードからアプリケーションを登録する必要があります。アプリケーションで Parse ライブラリーを初期化する際には、登録時に入手したキーを使用します。

Parse データ・オブジェクト

Parse でデータを表現するには、名前と値のペアを格納する ParseObject が使用されます。JSON 対応のデータであれば、あらゆるデータを ParseObject に格納することができます (リスト 1 を参照)。

リスト 1. ParseObject の一例
ParseObject myParseObject = new ParseObject("MyObject"); // Class Name
myParseObject.put("name", "C. Enrique Ortiz");
myParseObject.put("twitterHandle", "eortiz");
myParseObject.put("followers", 123456);

ParseObject をインスタンス化するときには、「クラス名」を指定します。リスト 1 では、クラス名として "MyObject" を指定しています。クラス名は、リレーショナル・データベースにおけるテーブル名のようなものです。このクラスの Parse オブジェクトのそれぞれは、リレーショナル・データベースの 1 つのテーブルに含まれる 1 つひとつの行のようなものです。

ParseObject は、Java Map クラスに見受けられるようなメソッド (put、get、remove など) を公開するだけでなく、ParseObject に固有のメソッドも数多く公開しています。

ParseObject の「名前キー」は英数字のみで構成されるようにする必要があります。指針としては、名前キーにはキャメル・ケースを使用してください。値は、JSON に格納できるデータ型であれば、任意のデータ型にすることができます。具体的には、数値、ストリング、ブール値、配列、JSONObject.NULLJSONObjectJSONArray のいずれのデータ型にすることもできます。これに加え、ParseObject でサポートされているデータ型には Java の Date 型や byte[] 配列もあります。さらに、ParseObject に他の ParseObject を含めることも可能です。

リスト 2 に、ParseObject でサポートされている値のデータ型の例を記載します。

リスト 2. ParseObject: サポートされている値のデータ型の例
// Byte Array
byte[] byteArray = {1, 2, 3, 4, 5};

// A date
Date d = new Date(); // java.util.Date

// A number
int number = 21;

// A String
String name = "Enrique";

// A JSONArray - any mix of JSONObjects, JSONArrays, Strings, Booleans, 
//   Integers, Longs, Doubles, null or NULL.
JSONArray jArray = new JSONArray();
jArray.put(number);
jArray.put(name);

// A JSONObject 
JSONObject jObject = new JSONObject();
try {
    jObject.put("number", number);
    jObject.put("name", name);
} catch (JSONException e) {
    e.printStackTrace();
}

// A ParseObject
ParseObject pObject = new ParseObject("MyObject"); // Class name
pObject.put("myByteArray", byteArray);
pObject.put("myDate", d);
pObject.put("myString", name);
pObject.put("myNumber", number);
pObject.put("myJsonArray", jArray);
pObject.put("myJsonObject", jObject);
pObject.put("myNull", JSONObject.NULL);

リスト 2 のコードでは、Parse クラウドにオブジェクトとして保存される ParseObject が作成されます。そして、このクラスの多数の MyObjectParseObject データ・オブジェクトの行として保存されます。これらの MyObject は、Parse のクラウド・ストレージに保存することが可能で、保存された MyObject に対して照会、更新、削除を行うことができます。しかも、アプリケーションがオフラインの状態でデータを保存することさえ可能です。Parse ライブラリーは、ネットワーク接続が再び確立されるまでデータをローカルに保存するからです。

ParseObject を変更する

モバイル・アプリケーションの開発に慣れていればご存知だと思いますが、ネットワーク操作などの長時間実行される操作は、一般にメインのシステム UI スレッドではなくワーカー・スレッドを使用して、バックグラウンドで行ってください。こうすることで、メインのシステム・スレッドがブロックされてユーザー・インターフェースの応答性に影響が及ぶことがなくなります。Parse では、バックグラウンドで簡単にオブジェクトを保存、削除、検索できるようになっています。この仕組みについては後ほど説明することとして、ここでは以下の同期メソッド remove() を見てください。このメソッドは、Parse オブジェクトからキーを削除するために使用するメソッドです。

pObject.remove("myNumber"); // remove the field/key "myNumber" from pObject

フィールドの削除または追加、あるいは現行フィールドの更新を行った後、そのデータ・オブジェクトをクラウドに保存 (または更新) するには、ParseObjectsave...() メソッドのいずれかを呼び出します。これらのメソッドについても、後ほど説明します。

ParseObject のまとめ

ParseObject は、Parse クラウド上のデータ・オブジェクトを表現します。このオブジェクトには、名前と値のペアを追加するためのメソッド、特定のキーが存在するかどうかをテストするメソッド、そして指定した ParseObject をサーバーから削除または取得するためのメソッドがあります。ParseObject では、各種の get...() および put...() メソッドを使用して ParseObject データの操作、ParseObject のマージ、サーバーへの ParseObject の保存などを行うこともできます。

Parse ユーザー、Parse ロール、Parse ACL

Parse オブジェクトで CRUD 操作を実行する方法を説明する前に、Parse ユーザー、Parse ロール、および Parse ACL (Access Control Lists) について知っておかなければならないことがあります。この 3 つはすべて極めて重要な概念であり、アプリケーションのデータ・オブジェクトの保護を強化します。

Parse ユーザー

ParseUser クラスはユーザーを表現し、Parse アプリケーションにユーザー・アカウント機能を提供します。すべての Parse アプリケーションには、Parse ユーザーが関連付けられます。ParseUserParseObject の 1 つですが、ユーザー名、パスワード、e-メールのプロパティーが追加されています。必要に応じて、他のデータ値を追加することも可能です。

Parse での匿名ユーザー

Parse での「匿名ユーザー」とは、ユーザー名もパスワードも設定されていないユーザーのことです。ユーザー認証を必要としないモバイル・アプリケーション機能には、匿名ユーザーが役立ちます。匿名ユーザーはデータ・オブジェクトを作成することはできても、作成されたオブジェクトの存続期間は短く、匿名ユーザーがログアウトすると使用できなくなります。

ユーザーは、アプリケーションの Parse ユーザーとしてサインアップすることができます (リスト 3 を参照)。

リスト 3. ParseUser — サインアップ
ParseUser user = new ParseUser();
user.setUsername("eortiz");
user.setPassword("123456");
user.setEmail("eortiz@nospam.com");
user.put("userType", "Author"); // add another field

// Call the asynchronous background method to sign up 
user.signUpInBackground(new SignUpCallback() {
  public void done(ParseException e) {
    if (e == null) {
      // Successful. Allow access to app.
    } else {
      // Failed....
    }
  }
});

usernameemail は一意でなければなりません。username または email がすでに使用されている場合、サインアップの呼び出しは失敗します。いずれかのフィールドが失敗した場合に備え、ユーザーに通知するためのメカニズム、および再試行するためのプロセスを用意してください。

サインアップが完了すると、ユーザーはアプリケーションにログインできるようになります (リスト 4 を参照)。

リスト 4. ParseUser — ログイン
ParseUser.logInInBackground("eortiz", "123456", new LogInCallback() {
  public void done(ParseUser user, ParseException e) {
    if (user != null) {
      // Successful. Allow access to app.
    } else {
      // Failed
    }
  }
});

ユーザー情報は、ParseUser.save() を呼び出すことによって更新することができます。ただし、ユーザー情報の内容を変更できるのは、その ParseUser の所有者だけであることに注意してください。所有者でないユーザーに対しては、データは読み取り専用になります。

Parse は現在ログインしているユーザーをキャッシュに入れます。現在のユーザーを照会するには、ParseUser.currentUser() を呼び出します。currentUser メソッドを使用すれば、現在のユーザーの情報に簡単にアクセスできるようになります。現在、ユーザー・セッションがアクティブでない場合は、クレデンシャルの入力を促すプロンプトのみが必要になります。リスト 5 に、Parse で現在のユーザーを取得する方法を示します。

リスト 5. ParseUser — 現在のユーザーを取得する
ParseUser currentUser = ParseUser.getCurrentUser();
if (currentUser != null) {
  // current user is valid
} else {
  // current user not valid, ask for credentials
}

現在のユーザーをリセットする

Parse で現在のユーザーをリセットするには、ParseUser.logOut() を呼び出します (リスト 6 を参照)。

リスト 6. ParseUser — 現在のユーザーをリセットする (ログアウト)
ParseUser.logOut(); // static method

Parse ACL

「ACL」とは、データ・オブジェクトに関連付けられたアクセス許可 (制御) のリストのことです。ParseACL クラスを使用することで、指定した ParseObject のアクセス許可を定義することができます。ACL では、アプリケーション・データ・オブジェクトに対するパブリック・アクセスを定義することも、(ロールを使用して) 特定のユーザーやユーザーのグループだけにアクセスを制限することもできます。リスト 7 に、Parse ACL の使用方法を示します。

リスト 7. ParseACL を使用してアクセスを許可する
// Define a Parse user
ParseUser user = new ParseUser();
user.setUsername(username);
:
:

// Define a read/write ACL
ParseACL rwACL = new ParseACL();
rwACL.setReadAccess(user, true); // allow user to do reads
rwACL.setWriteAccess(user, true); // allow user to do writes
:
:

// Define a Parse object and its ACL
ParseObject gameObject = new ParseObject("Game");
gameObject.setACL(rwACL); // allow user do read/writes on gameObject
gameObject.saveInBackground(); // save the ACL'ed object to the cloud
:
:

// You can define a public ACL that gives public access to the object
ParseACL publicACL = new ParseACL();
publicACL.setPublicReadAccess(true);
publicACL.setPublicWriteAccess(true);      
gameObject.setACL(publicACL); // allow public read/writes
gameObject.saveInBackground(); // save the ACL'ed object to the cloud

さらに、新たに作成されるすべてのオブジェクトに適用するためのデフォルト ACL を定義することもできます。リスト 8 では、リスト 7 の publicACL で定義されているように、読み取りと書き込みを一般に許可するようにデフォルトの ACL を設定しています。

リスト 8. デフォルト ACL を設定する
// Set a default ACL for all newly created objects as public access
ParseACL.setDefaultACL(publicACL, true);

ここには記載していませんが、ParseRole クラスを使って、ユーザーのグループにアクセス許可を与えることもできます。

次のセクションでは、Parse クラウドに Parse データ・オブジェクトを保存する方法、Parse クラウドに保存されている Parse データ・オブジェクトを取得する方法を説明します。

クラウドでの Parse データ・オブジェクト

ParseObject を作成してデータを入力した後は、そのデータ・オブジェクトを Parse クラウドに保存することができます。Parse クラウドにデータ・オブジェクトを保存するのは、Parse で実行する操作のうちで最も簡単な操作の 1 つです。データの表現、マーシャリング、ネットワーク通信、トランスポートなどに通常伴う複雑さは、Parse によって完全に隠されます。必要となる作業は、ヘルパー・メソッドを使用してデータ・オブジェクト・インスタンスと ParseObject とのマッピングをすること、そして Parse の保存操作を独自のスレッドにディスパッチするか、バックグラウンドでの保存メソッドを使用するかを決定することです。

システム・スレッドのブロックに注意してください!

モバイル・アプリケーションでは、ネットワーク処理やファイル処理、さらには長時間に及ぶ計算処理など、長い時間にわたって実行される処理はメインのシステム・スレッドで行わないようにする必要があることを思い出してください。このような処理は、メインのシステム・スレッドではなく、別個のワーカー・スレッドで実行します。システム・スレッドがブロックされた場合、アプリケーションの UI の応答性に悪影響が及び、アプリケーションが強制終了される結果となる可能性もあります。

ParseObject の保存メソッドには、save()saveInBackground() の 2 種類があります。このうち推奨される保存メソッドは、保存操作を独自のワーカー・スレッドで実行する saveInBackground() の方です。同期 save() メソッドを使用することにした場合は、UI がブロックされないようにするために、独自のワーカー・スレッドでこのメソッドが呼び出されるようにしなければならないことに注意してください。

リスト 9 に、バックグラウンドで Parse データ・オブジェクトを保存するコードを記載します。

リスト 9. バックグラウンドで ParseObject を保存する
// ParseObject
ParseObject pObject = new ParseObject("ExampleObject");
pObject.put("myNumber", number);
pObject.put("myString", name);
pObject.saveInBackground(); // asynchronous, no callback

リスト 10 には、コールバックを使用してバックグラウンドで Parse データ・オブジェクトを保存する場合のコードを記載します。

リスト 10. コールバックを使用してバックグラウンドで ParseObject を保存する
pObject.saveInBackground(new SaveCallback () {
    @Override
    public void done(ParseException ex) {
        if (ex == null) {
            isSaved = true;
        } else {
            // Failed
            isSaved = false;
        }
    }
  });

save...() メソッドには、以下のバリエーションがあります。

  • saveAllinBackground() は、コールバックあり、またはなしで ParseObject を保存します。
  • saveAll(List<ParseObject> objects) は、ParseObject のリストを保存します。
  • saveAllinBackground(List<ParseObject> objects) は、バックグラウンドで ParseObject のリストを保存します。
  • saveEventually() では、将来のある時点でデータ・オブジェクトをサーバーに保存することができます。Parse クラウドが現在アクセス可能でない場合には、このメソッドを使用します。

ParseObject がクラウドに正常に保存されると、一意のオブジェクト ID が割り当てられます。ParseObject インスタンスは、オブジェクト ID によって一意に識別されるため、このオブジェクト ID は極めて重要です。オブジェクト ID は、例えば、オブジェクトがクラウドに正常に保存されたかどうかを判別する場合や、特定の ParseObject インスタンスを取得して更新する場合、さらには特定の ParseObject を削除する場合などに使用されます。

クラウドに保存されているデータ・オブジェクトの取得

このセクションでは、Parse クラウドに保存されているデータ・オブジェクトを照会および取得するメソッドについて見ていきます。データ・オブジェクトの照会では、object-ID を基準に単一の ParseObject を照会することも、属性を使用して 1 つ以上の ParseObject を照会することもできます。既存の ParseObject がある場合は、サーバーから最新の値を取得することで、そのオブジェクトの中身を更新または同期させることができます。以降に記載するコード・スニペットで、これらの方法のそれぞれについて説明します。

ParseObject を取得する

Parse クラウドからデータ・オブジェクトを取得するには、ParseObjectfetch() メソッドまたは fetchInBackground() メソッドを使用します (リスト 11 を参照)。

リスト 11. 無条件に取得する
// ParseObject
ParseObject pObject = new ParseObject("ExampleObject");
:
:

// Fetch the parse object unconditionally
try {
    pObject.fetch();
} catch (ParseException e) {
    e.printStackTrace();
}

// Fetch the parse object unconditionally, with Callback
pObject.fetchInBackground(new GetCallback() {
    @Override
    public void done(ParseObject obj, ParseException ex) {
        if (ex == null) {
            // Success
        } else {
            // Failed
        }            
    }
});

必要な場合にのみ取得することもできます。リスト 12 は、他の Parse オブジェクトが関連付けられている Parse オブジェクトを取得する場合の例です。

リスト 12. 必要に応じて取得する
ParseObject po = new ParseObject("ExampleObject");
:

ParseObject po2 = po.getParseObject("key");

// Fetch only if needed
try {
    po2.fetchIfNeeded();
} catch (ParseException e) {
    e.printStackTrace();
}

必要に応じて取得するという処理を、コールバックを使用してバックグラウンドで実行することもできます。その場合には、ParseObjectfetchIfNeededInBackground(GetCallback callback) メソッドを使用します。

また、Parse オブジェクトのコレクションを無条件に、あるいは必要な場合にのみ、一度にまとめて取得しなければならないこともあります。ParseObject にはそのために、以下の一連の静的メソッドが用意されています。これらのメソッドは、いずれも ParseObject のリストを入力として取り、ParseObject のリストを返します。

  • fetchAll(List<ParseObject> objects)
  • fetchAllIfNeeded(List<ParseObject> objects)
  • fetchAllIfNeededInBackground(List<ParseObject> objects, FindCallback callback)
  • fetchAllInBackground(List<ParseObject> objects, FindCallback callback)

クラウドに保存されているデータ・オブジェクトの照会

Parse API が極めて包括的な API であることは、これまでの説明ですでに理解してもらえたと思いますが、まだ説明は終わっていません。データ・オブジェクトを取得できる他に、Parse では object-ID または属性を使用してデータ・オブジェクトを照会することもできます。Parse クラウドのデータ・オブジェクトを照会するには、ParseQuery を使用します。基本的なデータ・クエリーでも複雑なデータ・クエリーでも、ParseQuery を使用して特定のオブジェクトまたは条件が一致するオブジェクトの List を取得することができます。

リスト 13 に、object-ID を指定して特定の Parse オブジェクトをサーバーからバックグラウンド・スレッドで取得する方法を示します。

リスト 13. ParseQuery を使用して、指定した ParseObject を取得する
String myID = "12345";
ParseQuery query = new ParseQuery("Players");
query.getInBackground(myID, new GetCallback() {
    @Override
    public void done(ParseObject object, ParseException e) {
        if (object != null) {
            // Get object
        } else {
            // Not found
        }
    }            
});

query.getInBackground()ParseQuery キャッシュを使用しないことに注意してください。

リスト 14 に、Players クラスのすべてのデータ・オブジェクトを取得する場合のクエリーを記載します (制約の指定はありません)。

リスト 14. ParseQuery を使用して、指定したクラスのすべての ParseObject を取得する
ParseQuery query = new ParseQuery("Players");
query.findInBackground(new FindCallback() {
    @Override
    public void done(List<ParseObject> players, ParseException e) {
        if (players != null) {
            // Get list of players
        } else {
            // No players
        }
    }
});

リスト 15 では、クエリー制約を使用して、条件が一致する 1 つ以上の Parse オブジェクトを取得します。この例での制約は、ステータスがアクティブな Players であることです。

リスト 15. ParseQuery を使用して、条件が一致する ParseObject を取得する
ParseQuery query = new ParseQuery("Players");
query.whereEqualTo("status", "active");
query.findInBackground(new FindCallback() {
    @Override
    public void done(List<ParseObject> players, ParseException e) {
        if (players != null) {
            // Success - players contain active players 
        } else {
            // Failed
        }
    }
});

ParseQuery には、オブジェクト自体を取得するのではなく、条件が一致するオブジェクトのカウントを取得するためのメソッドもあります。このメソッドは、かなり有用です。リスト 16 に、アクティブなプレイヤーのカウントを取得する方法を示します。

リスト 16. ParseQuery を使用して、条件に一致する ParseObject をカウントする
ParseQuery query = new ParseQuery("Players");
query.whereEqualTo("status", "active"); //remove this line to count ALL
query.countInBackground(new CountCallback() {
    @Override
    public void done(int count, ParseException e) {
        if (e == null) {
            // Success, see count variable
        } else {
            // Failed
        }
    }
});

ParseQuery のメソッドと制約

ParseQuery がサポートしているクエリー制約メソッドは、20 種類以上あります。以下は、その一部の例です。

  • whereMatches(String key, String regex) は、指定された正規表現にマッチするストリング値を検索します。
  • whereStartsWith(String key, String prefix) は、指定されたストリングで始まるストリング値を検索します。
  • whereContains(String key, String substring) は、指定されたストリングが含まれる値を検索します。
  • whereGreaterThan(String key, Object value) は、指定された値より大きい値を検索します。
  • whereWithinKilometers(String key, ParseGeoPoint point, double maxDistance) は、指定された最大距離以内で、指定された地点付近の地点の値を持つオブジェクトを検索します。

クエリーの結果は、リスト 17 に記載するように並び順を指定することができます。クエリーの結果を順に並べるには、基準とするフィールドを指定して、query オブジェクトの query orderBy...() メソッドのいずれかを呼び出します。

リスト 17. クエリーの実行結果の並び順を指定する
query.orderByAscending("name"); 

query.orderByDescending("name");



For example:



ParseQuery query = new ParseQuery("Players");
query.whereEqualTo("status", "active");
query.orderByAscending("lastName"); // By lastname ascending order
query.findInBackground(new FindCallback() {
    @Override

  public void done(List<ParseObject> players, ParseException e) {

    if (players != null) {
      // Success - players contain active players

    } else {

      // Failed
		
                          } 

             }	

});

ParseQuery の結果はキャッシュされることにも注意してください。クエリーのキャッシュ・ポリシーは、アプリケーションのニーズに応じてさまざまな設定をすることができます。以下に、現在サポートされているキャッシュ・ポリシーを記載します。

  • IGNORE_CACHE: キャッシュを使用しません。これが、デフォルトのキャッシュ・ポリシーです。
  • CACHE_ONLY: キャッシュされている結果だけをロードします。キャッシュされている結果がない場合は、ParseException がスローされます。
  • NETWORK_ONLY: 常にネットワークにアクセスしますが、結果はキャッシュに保存します。
  • CACHE_ELSE_NETWORK: 最初にキャッシュを検索します。キャッシュに見つからなかった場合は、ネットワークからロードします。キャッシュでもネットワークでも見つからなかった場合は、ParseException がスローされます。
  • NETWORK_ELSE_CACHE: 最初にネットワークで検索します。ネットワークで見つからなかった場合は、キャッシュからロードします。ネットワークでもキャッシュでも見つからなかった場合は、ParseException がスローされます。
  • CACHE_THEN_NETWORK: 最初にキャッシュで検索した後、ネットワークからロードします。FindCallback は実際には 2 回呼び出されることに注意してください。1 回目はキャッシュされている結果で呼び出され、2 回目はネットワークの結果で呼び出されます。このポリシーは、findInBackground で非同期に使用することしかできません。

キャッシュ・ポリシーを設定するのは簡単です。キャッシュ・ポリシーは、find...() メソッドの呼び出しの前に設定します (リスト 18 を参照)。

リスト 18. CachePolicy を扱う
ParseQuery query = new ParseQuery("Players");
query.setCachePolicy(ParseQuery.CachePolicy.NETWORK_ELSE_CACHE);
query.findInBackground(new FindCallback() {
    @Override
    public void done(List<ParseObject> players, ParseException e) {
        if (e == null) {
            // Success - players contain active players 
        } else {
            // Failed
        }
    }
});

このように、ParseQuery クラスには、クラウドに保存されているデータ・オブジェクトを照会するために必要なすべてのメソッドが揃っています。ParseQuery では、あらゆる類のクエリー制約を指定することや、条件が一致するデータ・オブジェクトをカウントすること、制限を設定すること、データ・オブジェクトをスキップすること、結果の並びを指定すること、キャッシュをクリアすることなど、さまざまなことが可能です。


データ・オブジェクトの削除

Parse クラウドからデータ・オブジェクトを削除するのも至って簡単な操作です。オブジェクト・インスタンスを作成した後に、ParseObjectdelete() メソッドまたは deleteInBackground() メソッドを呼び出すだけで、既存の Parse オブジェクトをクラウドから削除することができます。リスト 19 に、この 2 つのメソッドを両方とも記載します。

リスト 19. ParseObject をクラウドから削除する
parseObject.delete();
parseObject.deleteInBackground();

ご想像のとおり、delete() はシステム・スレッドをブロックする呼び出しです。したがって、この呼び出しを独自のワーカー・スレッドに適切にディスパッチしなければなりません。あるいは、コールバックあり、またはコールバックなしの deleteInBackground() を使用して、Parse にスレッドの処理を任せることもできます。

ファイルの操作

ここまでは、Parse オブジェクトと Parse クエリーを扱ってきました。また、Parse ユーザー、ACL、ロールについても紹介しました。ここからは、Parse でのファイルの読み取り、書き込み、保存といった操作について説明して、記事を締めくくりたいと思います。

ParseObject には、byte[] データをそのまま格納できることを思い出してください。データ量が少ない場合はこの方法で問題ありませんが、画像やドキュメントなどのサイズが大きなアイテムを保存するときには、Parse ファイルを使用する必要があります。

Parse クラウド内のファイルは、ParseFile を使用して表現されます。ParseFile には、ファイルの名前、URL、そしてファイルのデータ本体を取得するメソッドが用意されています (ファイルにアクセスできることが前提です)。また、ファイルをダウンロードすることも、アップロードすることも、他のヘルパー・メソッドを利用することもできます。

ファイル・データは、byte[] 構文によって表現されます。現在のところ、サイズが 10MB を超えるファイルを扱うことはできないので注意してください。ファイルに名前を付ける際には、Parse ライブラリーが名前の競合を防いでくれます。ファイル拡張子を指定すると、Parse がファイルの内容を処理する上で有効です。

リスト 20 に、JPG ファイルを保存する例を記載します。

リスト 20. ParseFile を保存する
// Save image file
Drawable drawable = ...;
Bitmap bitmap = (Bitmap)((BitmapDrawable) drawable).getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] data = stream.toByteArray();                
ParseFile imageFile = new ParseFile("image.jpg", data);
imageFile.saveInBackground();

リスト 20 の最初のステートメントは、ビットマップを byte[] に変換します。変換後の byte[] を保存するには、ParseObject をサーバーに保存する場合と同様に、ParseFile の saveInBackground() メソッドを使用します。

Parse にファイルを保存した後は、そのファイルを Parse オブジェクトに関連付ける (格納する) 必要があります。つまり、Parse ファイルは真のスタンドアロンのオブジェクトではないため、特定の ParseObject インタンスが関連付けられていない限り、保存された後のファイルを取得して後で使用することはできません。この制約には、Parse の今後のリリースで対処されるはずです。リスト 21 に、画像ファイルを Players Parse オブジェクトに関連付ける例を記載します。

図 21. ParseFile を ParseObject に関連付ける
// Associate image with Parse object
ParseObject po = new ParseObject("Players");
po.put("name", "eortiz");
po.put("photo", imageFile);
po.saveInBackground();

上記では、ファイルにデータ・オブジェクトを関連付けた後、前に説明した saveInBackgroud() を使用してオブジェクトをサーバーに保存します。

リスト 22 に、データ・オブジェクトが関連付けられたファイルを取得する方法を示します。

リスト 22. ParseFile を取得する
// Retrieving the file 
ParseFile imageFile2 = (ParseFile)po.get("photo");
imageFile2.getDataInBackground(new GetDataCallback() {
  public void done(byte[] data, ParseException e) {
    if (data != null) {
      // Success; data has the file
    } else {
      // Failed
    }
  }
});

ParseObject から ParseFile 参照を受け取った後、getDataInBackground() を呼び出してサーバーから ParseFile を取得しました。ParseQueryParseObject を取得する場合のコールバックは GetCallback ですが、ParseFile を取得する場合のコールバックは GetDataCallback であることに注意してください。

まとめ

Parse API では、プッシュ通知などのモバイル・サービスにアクセスするためのクラス、ジオ・データを使用するためのクラス、そしてソーシャル・メディア・プラットフォームを統合するためのクラスなど、非常に幅広いクラスを網羅しています。この記事では、Parse で実行できる処理のほんの一部として、データおよびファイルのクラウド・ストレージに対応する Parse API を紹介しました。この記事で学んだ Parse ユーザー、データ・オブジェクト、ファイル、および ACL の保存および操作方法の知識を基に、このモバイル開発用クラウド・プラットフォームをさらに詳しく探ってください。

謝辞

この記事をレビューしてくださった Athen O'Shea に心より感謝いたします。

参考文献

学ぶために

  • Parse Android SDK の詳細を学んでください。また、モバイル・プラットフォームの選択、アプリケーションのセットアップ、Parse SDK のダウンロードとインストールについては、Parse Quick Guide を参照してください。
  • Parse Android APIs を網羅した完全なリストを参照してください。
  • Develop Android applications with Eclipse」(Frank Ableson 著、developerWorks、2008年2月): Eclipse 開発環境で Android アプリケーション開発を実践するには、Android Eclipse プラグインも使用してみてください。
  • jQuery Mobile 入門」(C. Enrique Ortiz 著、developerWorks、2012年2月): jQuery Mobile の基礎と、機能的なモバイル Web アプリケーション・ユーザー・インターフェースを作成する方法を学んでください。この記事ではサンプルを用いて、jQuery Mobile の基本的なページ、ナビゲーション、ツールバー、リスト・ビュー、フォームのコントロール、そして切替効果について解説します。
  • さまざまな機器とプラットフォームの組み合わせに対応したモバイル・アプリケーションをクラウドに統合する際の難題を解決する」(Olivier Picciotto 著、developerWorks、2012年8月): 最近では、もはやモバイル開発とクラウド・コンピューティングは切っても切れない関係となっていますが、クラウドへのモバイル・アプリケーションの統合は、今でも新しい領域です。モバイル・エンタープライズ・アプリケーション・プラットフォーム (MEAP) がどのようにモバイルとクラウドの統合に関する難題を解決するかを学んでください。
  • モバイル開発のための DevOps」(Michael Galpin 著、developerWorks、2012年7月): 世界中の企業は、モバイル・コンピューティングを容易にするアプリケーションを顧客やユーザーに提供することにより、モバイル市場を活用しようとしています。この記事では、職場でのモバイル・プラットフォームの開発と運用の統合に伴う技術的およびビジネス上の課題のいくつかを検討します。
  • Twitter で developerWorks をフォローしてください。
  • developerWorks の on-demand demos で、初心者向けの製品のインストールとセットアップから、熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを見てください。

議論するために

  • developerWorks コミュニティーに参加してください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者によるブログ、フォーラム、グループ、Wiki を調べることができます。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology, Mobile development, Cloud computing
ArticleID=851785
ArticleTitle=Android アプリケーション向けのクラウド・ベースのサービス Parse
publish-date=12202012