【parse】ParseのAndroid Guideを勝手に日本語訳 ~Objects~
公開日:
:
parse
Parseのドキュメントの日本語訳です。
初めての翻訳に挑戦です。ウェルカム添削
Android Guide
まだSDKをインストールしていない場合は、クイックスタートガイドからSDKを取得してEclipseにインポートして下さい。
はじめに
Parseプラットフォームはあなたのモバイルアプリケーションに完全なバックエンドソリューションを提供します。
我々のゴールはサーバーサイドのコーディングとサーバー管理を取り除くことにあります。
もしあなたが、Ruby on Railsのようなwebフレームワークに親しみがあるなら、私たちはそれらの多くの指針を採用し、このプラットフォームに適用しました。特に、このSDKは既に最小限の設定で使うことができます。
Apps
Parseでは1つのモバイルアプリケーションにつき1のAppを作成します。それぞれのAppは固有のアプリケーションIDとクライアントキーをもち、対応するあなたのアプリケーションに適用します。Parseのアカウントは複数のAppに対応しています。1つのアプリケーションしかない場合でも、異なるバージョンやテストをデプロイする場合に有効です。
オブジェクト
The ParseObject
Parseに保存されるデータはParseOjbectによって作成されます。それぞれのParseObjectはキーとバリューを持つJSON互換のデータを含んでいます。このデータはスキーマを持たず、これは各々のParseObjectにどのキーが存在するか予め特定する必要がないことを示します。ただ単にどんなキーとバリューのペアでもセットすれば、バックエンドでこれを保存します。
例えば、ゲームのハイスコアを記録するとしましょう。1つのParseObjectは以下を含みます。
score: 1337, playerName: "Sean Plott", cheatMode: false
キーはアルファベットである必要があります。バリューは文字列、数値、真偽値やJSONにエンコードできる配列やオブジェクトです。
各ParseObjectはデータの並び順の違いを見分けるのに必要なクラス名を持っています。例えば、上記のハイスコアオブジェクトをGameScoreと呼ぶことができます。コードをきれいに保つため、クラス名はNameYourClassesLikeThisのように、またキーはnameYourKeysLikeThisのようにすることをお勧めします。
オブジェクトの保存
GameScoreをサーバー上に保存したいとしましょう。インターフェイスはMapににており、あとsaveInBackgroundメソッドを使います。
ParseObject gameScore = new ParseObject("GameScore"); gameScore.put("score", 1337); gameScore.put("playerName", "Sean Plott"); gameScore.put("cheatMode", false); gameScore.saveInBackground();
このコードが実行されても、もしかしたら何が起こったか分からないかもしれません。データが保存されたことを確認するためにParse上のあなたが登録したappのData Browserを見ることができます。以下のようなデータがみれるはずです。
objectId: "xWMyZ4YEGZ", score: 1337, playerName: "Sean Plott", cheatMode: false, createdAt:"2011-06-10T18:33:42Z", updatedAt:"2011-06-10T18:33:42Z"
注意すべき点が2つあります。このコードを実行する前にGameScoreクラスを作成する前に何かを設定する必要はありません。Parseアプリケーションは初めてのクラス名に出会うとクラスを作成します。
また、利便性のために、いくつか特定する必要のないフィールドが与えられます。objectIdは保存されたオブジェクトのユニークなIDです。createdAtとupdatedAtはオブジェクトが作成されたり最後に変更された時間を意味します。これらのフィールドはサーバー上で埋め込まれるので保存処理が完了するまではParseObjectには存在しません。
オブジェクトの取得
クラウドにデータを保存するのは楽しいですが、取り出すのはもっと楽しいです。もしobjectIdを持っているなら、ParseQueryを使って全てのParseObjectを取り出すことができます。
ParseQuery query = new ParseQuery("GameScore"); query.getInBackground("xWMyZ4YEGZ", new GetCallback() { public void done(ParseObject object, ParseException e) { if (e == null) { // object will be your game score } else { // something went wrong } } }); [\java] ParseObjectからデータを取り出すにはそれぞれのデータ型のgetXメソッドを使います。 1 int score = gameScore.getInt("score"); String playerName = gameScore.getString("playerName"); boolean cheatMode = gameScore.getBoolean("cheatMode"); [\java] もしデータの型が分からない場合はget(key)を使用しますが、たいていは適切にキャストする必要があります。大抵の場合はgetStringのように型付きのアクセッサを使用します。 </p> <p> 3つの特別は値はそれぞれのアクセッサを持ちます。 1 String objectId = gameScore.getObjectId(); Date updatedAt = gameScore.getUpdatedAt(); Date createdAt = gameScore.getCreatedAt(); [\java] 既に取得済みのオブジェクトをサーバー上の最新のデータに更新するにはrefreshInBackgroundメソッドをこの様に呼び出します。 1 myObject.refreshInBackground(new RefreshCallback() { public void done(ParseObject object, ParseException e) { if (e == null) { // Success! } else { // Failure! } } });
オブジェクトのオフラインでの保存
ほとんどの保存機能は即座に実行され、保存が完了した時にあなたのアプリケーションに知らせます。いつ完了したかを知る必要がない場合はsaveEventuallyを代わりに使用します。その利点は、ユーザーがネットワークに接続していない場合にsaveEventuallyはネットワークが再接続されるまでデバイス上で更新データを保存します。全てのsaveEventually(とdeleteEventually)は呼ばれた順に実行されるので、1つのオブジェクトで何度saveEventuallyを呼び出しても安全です。
ParseObject gameScore = new ParseObject("GameScore"); gameScore.put("score", 1337); gameScore.put("playerName", "Sean Plott"); gameScore.put("cheatMode", false); gameScore.saveEventually(); [\java] </p> <h3>オブジェクトの更新</h3> <p> オブエジェクトの更新は簡単です。オブジェクトに新しいデータをセットして保存メソッドを呼び出すだけです。例えば 1 // Create the object. final ParseObject gameScore = new ParseObject("GameScore"); gameScore.put("score", 1337); gameScore.put("playerName", "Sean Plott"); gameScore.put("cheatMode", false); gameScore.put("skills", Arrays.asList("pwnage", "flying")); gameScore.saveInBackground(new SaveCallback() { public void done(ParseException e) { // Now let's update it with some new data. In this case, only cheatMode and score // will get sent to the server. playerName hasn't changed. gameScore.put("score", 1338); gameScore.put("cheatMode", true); gameScore.saveInBackground(); } });
Parseはどのデータが変更されたかを理解しているので”汚れた”フィールドだけがサーバーにアップされます。意図しない更新でサーバー上のデータが押しつぶされる心配はありません。
カウンター
上記の例は一般的な使用例を含んでいます。”score”フィールドはプレイヤーの最新スコアと共に継続的に更新される必要があります。上記のメソッドは機能しますが、面倒だし複数のクライアントが同じカウンターを更新しようとすると問題になります。
カウンタータイプのデータ保存を助けるために、Parseは数値フィールドを自動でインクリメント(またはデクリメント)するメソッドを用意しています。ですので、同じ更新が下記のように書き換えられます。
gameScore.increment("score"); gameScore.saveInBackground();
また、increment(key, amount)を使うことで指定分だけインクリメントすることができます。
配列
文字列配列の保存のために配列
- addとaddAllは与えられたオブジェクトを配列の最後に加えます
- addUniqueとaddAllUniqueはまだ配列が存在しない場合のみ付加します。挿入位置は保証されません。
- removeAllは配列フィールドから与えられたオブジェクト全てを除きます
例えば”skills”のようなフィールドに項目を追加できます。
gameScore.addAllUnique("skills", Arrays.asList("flying", "kungfu")); gameScore.saveInBackground();
オブジェクトの削除
サーバーからオブジェクトを削除します。
myObject.deleteInBackground();
削除が確認された時にコールバックを実行したい場合は、DeleteCallbackをdeleteInBackgroundメソッドに渡します。呼び出したスレッドをブロックしたい場合はdeleteメソッドを使用します。
removeメソッドで一つのフィールドをオブジェクトから削除できます。
// After this, the playerName field will be empty myObject.remove("playerName"); // Saves the field deletion to the Parse servers myObject.saveInBackground();
関連データ
オブジェクトは他のオブジェクトと関連を持つことができます。このモデルの振る舞いは、どのParseObjectでも、他の複数のParseObjectのバリューなることができます。内部的にParseフレームワークは一貫性を保つため、参照されたオブジェクトを一箇所で保存します。
例えば、ブログアプリで各Commentは1つのPostに対応します。1つのCommentを持つPostオブジェクトを作成するにはこのように書けます。
// Create the post ParseObject myPost = new ParseObject("Post"); myPost.put("title", "I'm Hungry"); myPost.put("content", "Where should we go for lunch?"); // Create the comment ParseObject myComment = new ParseObject("Comment"); myComment.put("content", "Let's do Sushirrito."); // Add a relation between the Post and Comment myComment.put("parent", myPost); // This will save both myPost and myComment myComment.saveInBackground();
あるオブジェクトを取得するとき、関連付けられたParseObjectたちは取得されません。これらのオブジェクトのバリューはこのように取得されるまでは取り出せません。
fetchedComment.getParseObject("post").fetchIfNeededInBackground(new GetCallback() { public void done(ParseObject object, ParseException e) { String title = post.getString("title"); } }); [\java] </p> <p> また、ParseRelationオブジェクトを使用することで多対多の関係を作ることもできます。これはListのように機能しますが、関連をもったParseObjectたちを一度にダウンロードする必要はありません。これは、ParseRelationがListより大量のオブジェクトへと拡張させます。例えば、Userは好きなだけたくさんのPostを持っているとします。この場合、UserのgetRelationメソッドを使ってPostの集合を保存できます。postをリストに加えるためのコードはこのようになります。 1 ParseUser user = ParseUser.getCurrentUser(); ParseRelation relation = user.getRelation("likes"); relation.add(post); user.saveInBackground();
下記のようにしてParseRelationからpostを削除できます
relation.remove(post);
デフォルトでは、この関連のオブジェクトのリストはダウンロードされません。getQueryの返り値のParseQueryのfindInBackgroundを呼ぶことでPostのリストを得られます。コードはこの様に書きます。
relation.getQuery().findInBackground(new FindCallback() { void done(List<ParseObject> results, ParseException e) { if (e != null) { // There was an error } else { // results have all the Posts the current user liked. } } });
もし、Postの部分集合だけが欲しいのであれば、getQueryに返されるParseQueryに追加の制約を付けることができます。このように書きます。
ParseQuery query = relation.getQuery(); // Add other query constraints.
ParseQueryについての詳細はこのガイドのクエリセクションを見て下さい。ParseRelationの振る舞いは問い合わせ目的ではリストに似ていますので、オブジェクト上でリストにできる問い合わせはParseRelation上でも可能です。
データ型
これまでのところString, int, bool とParseObject型の値を使ってきました。Parseはjava.util.Date, byte[], JSONObject.NULLもサポートしています。
例:
int myNumber = 42; String myString = "the number is " + myNumber; Date myDate = new Date(); JSONArray myArray = new JSONArray(); myArray.put(myString); myArray.put(myNumber); JSONObject myObject = new JSONObject(); myObject.put("number", myNumber); myObject.put("string", myString); byte[] myData = { 4, 8, 16, 32 }; ParseObject bigObject = new ParseObject("BigObject"); bigObject.put("myNumber", myNumber); bigObject.put("myString", myString); bigObject.put("myDate", myDate); bigObject.put("myData", myData); bigObject.put("myArray", myArray); bigObject.put("myObject", myObject); bigObject.put("myNull", JSONObject.NULL); bigObject.saveInBackground();
ParseObjectにbyte[]を使った画像やドキュメントなど巨大なデータを保存することはお勧めしません。ParseObjectは128kBを超えるべきではありません。大きなデータを保存する場合はParseFileの使用をお勧めします。詳細はファイルのセクションを御覧ください。
Parseがどのようにデータを扱うかについてより詳細な情報についてはData & Securityを御覧ください。
その他の操作
データを管理する場合ために、ParseはParseObjectに対するいくつもの便利な操作を用意しています。
カウンター
多くのアプリケーションがカウンターデータを持っています。ゲームスコアやゴールドコイン、羊でさえも。
Parseは原子性を持ってカウンターデータを更新する簡単な方法を提供します。
例えば
ParseObject player = new ParseObject("Player"); player.put("goldCoins", 1); player.saveInBackground(); // Later .. player.increment("goldCoins"); player.saveInBackground();
また、increment(key, intN)を使って1以上の数をインクリメントすることもできます。
関連記事
-
【parse】ParseのAndroid Guideを勝手に日本語訳 ~Push Notifications~
Parseのドキュメントの日本語訳です。 目次 プッシュ通知 アプリケーションへの
- PREV
- BaaSでサーバーサイドサービスが簡単に
- NEXT
- デザインパターンを学ぶ