FJCT_ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

Parse Serverのデータストア操作法(Unity SDK編)

NCMBのクロージングに伴って、アプリのバックエンド移行先を検討する必要が出ています。その開発については申し訳ない限りなのですが、そのために必要な情報は適宜お届けしていきます。

この記事では、移行先の候補であるParse Serverについて、その基本的な使い方を解説します。今回はUnity SDKです。

インストール

link.xml というファイルをアセットフォルダの中に作成し、内容を以下のように記述します。

<linker>
  <assembly fullname="UnityEngine">
    <type fullname="UnityEngine.iOS.NotificationServices" preserve="all"/>
    <type fullname="UnityEngine.iOS.RemoteNotification" preserve="all"/>
    <type fullname="UnityEngine.AndroidJavaClass" preserve="all"/>
    <type fullname="UnityEngine.AndroidJavaObject" preserve="all"/>
  </assembly>

  <assembly fullname="Parse.Unity">
    <namespace fullname="Parse" preserve="all"/>
    <namespace fullname="Parse.Internal" preserve="all"/>
  </assembly>
</linker>

データストアの使い方

オブジェクトの作成

まず基本形です。NCMBでいう NCMBObject obj = new NCMBObject ("GameScore"); に相当する処理です。

ParseObject gameScore = new ParseObject("GameScore");

新規作成

フィールドの追加は、キーに対して値を設定します。

gameScore["score"] = 1337;
gameScore["playerName"] = "Sean Plott";
Task saveTask = gameScore.SaveAsync();

更新

更新は新規保存と同じく SaveAsync メソッドで行います。

gameScore["cheatMode"] = true;
gameScore["score"] = 1338;
gameScore.SaveAsync();

特殊な更新操作

以下のメソッドはNCMBと同じように使えるメソッドです。

メソッド名 説明
Increment 数値のインクリメント
AddToList データの配列による追加
AddRangeToList データの配列による追加(引数が配列版)
AddUniqueToList データが配列に対してユニークな場合に追加
AddRangeUniqueToList データが配列に対してユニークな場合に追加(引数が配列版)
RemoveAllFromList 該当する値を配列から削除

フィールドを消す

フィールドの値を削除する際には Remove を行ったあと、保存します。

gameScore.Remove("playerName");
gameScore.SaveAsync();

削除

データの削除は DeleteAsync メソッドで行います。

gameScore.DeleteAsync();

値の取得

各フィールドの値を取得する際には Get メソッドを使います。

int number = gameScore.Get<int>("myNumber");
string str = gameScore.Get<string>("myString");
DateTime date = gameScore.Get<DateTime>("myDate");
byte[] data = gameScore.Get<byte[]>("myData");

規定のフィールドは以下の通りです。

string objectId = gameScore.ObjectId;
DateTime? updatedAt = gameScore.UpdatedAt;
DateTime? createdAt = gameScore.CreatedAt;
ParseACL? parseACL = gameScore.ACL;

検索

クエリーオブジェクトの作成

データを検索する際には、 ParseQuery.GetQuery を使います。

var query = ParseObject.GetQuery("GameScore")

データ1件の取得

データを1件だけ取得する場合には、FirstAsyncを指定します。

query.FirstAsync().ContinueWith(t =>
{
    ParseObject obj = t.Result;
});

既存データの再取得を行う場合には FetchAsync メソッドを使います。

Task<ParseObject> fetchTask = myObject.FetchAsync();

条件を指定して検索

データを検索する際には、条件を指定して FindAsync メソッドで取得します。

var query = ParseObject.GetQuery("GameScore")
    .WhereEqualTo("playerName", "Dan Stemkoski");
query.FindAsync().ContinueWith(t =>
{
    IEnumerable<ParseObject> results = t.Result;
});

結果の行数も欲しい場合には CountAsync を使います。この場合、結果のカウント数のみが返ってきます。

var query = ParseObject.GetQuery("GameScore")
    .WhereEqualTo("playerName", "Sean Plott");
query.CountAsync().ContinueWith(t =>
{
    int count = t.Result;
});

なお、検索条件はNCMBとほぼ同じように指定できます。

  • WhereEqualTo
  • WhereNotEqualTo
  • WhereGreaterThan
  • WhereGreaterThanOrEqualTo
  • WhereLessThan
  • WhereLessThanOrEqualTo
  • WhereContainsAll
  • WhereContainedIn
  • WhereNotContainedIn
  • WhereExists
  • WhereDoesNotExist
  • WhereStartsWith

また、クエリーの結果を検索条件に指定する WhereMatchesKeyInQuery があります。

var teamQuery = ParseQuery.GetQuery("Team")
    .WhereGreaterThan("winPct", 0.5);
var userQuery = ParseUser.Query
    .WhereMatchesKeyInQuery("hometown", "city", teamQuery);
userQuery.FindAsync(t =>
{
    IEnumerable<ParseUser> results = t.Result;
});

その他、結果の絞り込みを行うメソッドです。

  • Limit
  • Skip
  • OrderBy
  • OrderByDescending

ポインター

ParseObject同士をつなげるポインター機能です。NCMBでも同様の機能がありますが、よりパワーアップした使い方ができます。

これはGemeオブジェクトに対して、現在のユーザーを紐付けた例です。

var game = new ParseObject("Game");
game["createdBy"] = ParseUser.CurrentUser;

ポインターになるオブジェクトは複数指定できます。

var scimitar = ...
var plasmaRifle = ...
var grenade = ...
var bunnyRabbit = ...

// stick the objects in an array
var weapons = new List<ParseObject>();
weapons.Add(scimitar);
weapons.Add(plasmaRifle);
weapons.Add(grenade);
weapons.Add(bunnyRabbit);

// store the weapons for the user
var user = ParseUser.CurrentUser;
user.AddRangeToList("weaponsList", weapons);

どちらも Get メソッドでデータを取得できます。

var weapons = ParseUser.CurrentUser.Get<IList<Object>>("weaponsList");

データ取得時にポインターデータも取得する場合には include メソッドを使います。

var userQuery = ParseUser.Query;
userQuery = userQuery.Include("weaponsList");

// execute the query
IEnumerable<ParseUser> results = await userQuery.FindAsync();

まとめ

Parse Serverのデータストア操作はNCMBとほぼ変わりません。ただし、スキーマレスではないので、管理画面であらかじめスキーマ設計を行う必要がある点に注意してください。

サービス終了に伴って開発が発生してしまう点については、弁解の余地がありません。開発者の皆さんに対して申し訳なく思っております。そうした中、Parse ServerはNCMBと設計思想が似ているので、移行にかかる工数が大きくなりすぎないのが利点です。

NCMBとしては今後、移行に伴う情報を積極的に発信していきます。皆さんには大変ご迷惑をおかけしますが、移行のご検討をお願い申し上げます。

Parse Platform