Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

データの取得

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このドキュメントでは、データ取得の基本と、Firebase データの順序付けとフィルタリングの方法について説明します。

あなたが始める前に

Realtime Databaseを使用する前に、次のことを行う必要があります。

  • Unity プロジェクトを登録し、Firebase を使用するように構成します。

    • Unity プロジェクトですでに Firebase を使用している場合は、Firebase 用に既に登録および構成されています。

    • Unity プロジェクトがない場合は、サンプル アプリをダウンロードできます。

  • Unity プロジェクトにFirebase Unity SDK (具体的にはFirebaseDatabase.unitypackage ) を追加します。

Unity プロジェクトに Firebase を追加するには、 Firebase コンソールと開いている Unity プロジェクトの両方でタスクが必要になることに注意してください (たとえば、コンソールから Firebase 構成ファイルをダウンロードして、それらを Unity プロジェクトに移動します)。

データの取得

Firebase データは、GetValueAsync() を 1 回呼び出すか、 FirebaseDatabase参照のイベントにアタッチすることによって取得されます。イベント リスナーは、データの初期状態に対して 1 回呼び出され、データが変更されるたびに再度呼び出されます。

DatabaseReference を取得する

データベースからデータを読み取るには、 DatabaseReferenceのインスタンスが必要です。

using Firebase;
using Firebase.Database;
using Firebase.Extensions.TaskExtension; // for ContinueWithOnMainThread

public class MyScript: MonoBehaviour {
  void Start() {
    // Get the root reference location of the database.
    DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference;
  }
}

データを 1 回読み取る

GetValueAsyncメソッドを使用して、特定のパスにあるコンテンツの静的スナップショットを 1 回読み取ることができます。タスクの結果には、子データを含む、その場所のすべてのデータを含むスナップショットが含まれます。データがない場合、返されるスナップショットはnullです。

    FirebaseDatabase.DefaultInstance
      .GetReference("Leaders")
      .GetValueAsync().ContinueWithOnMainThread(task => {
        if (task.IsFaulted) {
          // Handle the error...
        }
        else if (task.IsCompleted) {
          DataSnapshot snapshot = task.Result;
          // Do something with snapshot...
        }
      });

イベントをリッスンする

イベント リスナーを追加して、データの変更をサブスクライブできます。

イベント典型的な使用法
ValueChangedパスの内容全体に対する変更を読み取り、リッスンします。
ChildAddedアイテムのリストを取得するか、アイテムのリストへの追加をリッスンします。リストへの変更を監視するには、 ChildChangedおよびChildRemovedと一緒に使用することをお勧めします。
ChildChangedリスト内の項目への変更をリッスンします。リストへの変更を監視するには、 ChildAddedおよびChildRemovedと共に使用します。
ChildRemovedリストから削除される項目をリッスンします。リストへの変更を監視するには、 ChildAddedおよびChildChangedと共に使用します。
ChildMoved順序付きリスト内のアイテムの順序の変更をリッスンします。 ChildMovedイベントは、アイテムの順序を変更する原因となったChildChangedイベントに常に続きます (現在の order-by メソッドに基づいて)。

ValueChanged イベント

ValueChangedイベントを使用して、特定のパスにあるコンテンツの変更をサブスクライブできます。このイベントは、リスナーがアタッチされたときに 1 回トリガーされ、子を含むデータが変更されるたびに再度トリガーされます。イベント コールバックには、子データを含む、その場所にあるすべてのデータを含むスナップショットが渡されます。データがない場合、返されるスナップショットはnullです。

次の例は、データベースからリーダーボードのスコアを取得するゲームを示しています。

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders")
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

ValueChangedEventArgsには、イベント時にデータベース内の指定された場所にあるデータを含むDataSnapshotが含まれます。スナップショットでValueを呼び出すと、データを表すDictionary<string, object>が返されます。その場所にデータが存在しない場合、 Valueを呼び出すとnullが返されます。

この例では、 args.DatabaseErrorも調べて、読み取りがキャンセルされたかどうかを確認します。たとえば、クライアントが Firebase データベースの場所から読み取る権限を持っていない場合、読み取りをキャンセルできます。 DatabaseErrorは、失敗が発生した理由を示します。

同じパスを持つ任意のDatabaseReferenceを使用して、後でイベントからサブスクライブを解除できます。 DatabaseReferenceインスタンスは一時的なものであり、任意のパスとクエリにアクセスする方法と考えることができます。

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders")
        .ValueChanged -= HandleValueChanged; // unsubscribe from ValueChanged.
    }

子イベント

子イベントは、 Push()メソッドを介して追加された新しい子やUpdateChildrenAsync()メソッドを介して更新された子などの操作からノードの子に発生する特定の操作に応答してトリガーされます。これらはそれぞれ、データベース内の特定のノードへの変更をリッスンするのに役立ちます。たとえば、以下に示すように、ゲームはこれらのメソッドを一緒に使用して、ゲーム セッションのコメント内のアクティビティを監視する場合があります。

      var ref = FirebaseDatabase.DefaultInstance
      .GetReference("GameSessionComments");

      ref.ChildAdded += HandleChildAdded;
      ref.ChildChanged += HandleChildChanged;
      ref.ChildRemoved += HandleChildRemoved;
      ref.ChildMoved += HandleChildMoved;
    }

    void HandleChildAdded(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildChanged(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildRemoved(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildMoved(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

ChildAddedイベントは通常、Firebase データベース内のアイテムのリストを取得するために使用されます。 ChildAddedイベントは、既存の子ごとに 1 回発生し、新しい子が指定されたパスに追加されるたびに発生します。リスナーには、新しい子のデータを含むスナップショットが渡されます。

ChildChangedイベントは、子ノードが変更されるたびに発生します。これには、子ノードの子孫への変更が含まれます。これは通常、 ChildAddedおよびChildRemovedイベントと組み合わせて使用​​され、アイテムのリストへの変更に応答します。イベント リスナーに渡されるスナップショットには、子の更新されたデータが含まれています。

ChildRemovedイベントは、直接の子が削除されるとトリガーされます。これは通常、 ChildAddedおよびChildChangedコールバックと組み合わせて使用​​されます。イベント コールバックに渡されるスナップショットには、削除された子のデータが含まれています。

ChildMovedイベントは、子の並べ替えを引き起こす更新によってChildChangedイベントが発生するたびにトリガーされます。 OrderByChildまたはOrderByValueで並べ替えられたデータで使用されます。

データのソートとフィルタリング

Realtime Database Queryクラスを使用して、キー、値、または子の値で並べ替えられたデータを取得できます。並べ替えられた結果を特定の数の結果またはキーまたは値の範囲にフィルター処理することもできます。

データの並べ替え

並べ替えられたデータを取得するには、次のいずれかの order-by メソッドを指定して、結果の並べ替え方法を決定することから始めます。

方法使用法
OrderByChild()指定した子キーの値で結果を並べ替えます。
OrderByKey()結果を子キーで並べ替えます。
OrderByValue()結果を子の値で並べ替えます。

一度に使用できる order-by メソッドは1 つだけです。同じクエリで order-by メソッドを複数回呼び出すと、エラーがスローされます。

次の例は、スコア順に並べられたスコア リーダーボードでサブスクライブする方法を示しています。

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders").OrderByChild("score")
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

これは、 valuechanged イベント リスナーと組み合わせると、各エントリのスコア順に並べられたデータベース内のリーダーボードとクライアントを同期させるクエリを定義します。データを効率的に構造化する方法については、データベースの構造化 を参照してください。

OrderByChild()メソッドの呼び出しは、結果を並べ替える子キーを指定します。この場合、結果は各子の"score"値によってソートされます。他のデータ型の順序付けの詳細については、クエリ データの順序付け方法を参照してください。

データのフィルタリング

データをフィルター処理するには、クエリを作成するときに limit メソッドまたは range メソッドを order-by メソッドと組み合わせることができます。

方法使用法
LimitToFirst()結果の順序付きリストの先頭から返す項目の最大数を設定します。
LimitToLast()結果の順序付けられたリストの最後から返される項目の最大数を設定します。
StartAt()選択した order-by メソッドに応じて、指定されたキーまたは値以上のアイテムを返します。
EndAt()選択した order-by メソッドに応じて、指定されたキーまたは値以下の項目を返します。
EqualTo()選択した order-by メソッドに応じて、指定されたキーまたは値に等しいアイテムを返します。

order-by メソッドとは異なり、複数の limit または range 関数を組み合わせることができます。たとえば、 StartAt() () メソッドとEndAt()メソッドを組み合わせて、結果を指定した範囲の値に制限できます。

クエリに一致するものが 1 つしかない場合でも、スナップショットはリストのままです。単一のアイテムが含まれているだけです。

結果の数を制限する

LimitToFirst()およびLimitToLast()メソッドを使用して、特定のコールバックで同期する子の最大数を設定できます。たとえば、 LimitToFirst()を使用して制限を 100 に設定した場合、最初は最大 100 のChildAddedコールバックしか受け取りません。 Firebase データベースに保存されているアイテムが 100 未満の場合、アイテムごとにChildAddedコールバックが発生します。

アイテムが変更されると、クエリに入るアイテムのChildRemovedコールバックとクエリからドロップするアイテムのChildAddedコールバックを受け取り、合計数が 100 に留まるようにします。

たとえば、次のコードはリーダーボードからトップ スコアを返します。

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders").OrderByChild("score").LimitToLast(1)
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

キーまたは値でフィルタ

StartAt()EndAt() 、およびEqualTo()を使用して、クエリの任意の開始点、終了点、および等価点を選択できます。これは、データのページ付けや、特定の値を持つ子を持つアイテムの検索に役立ちます。

クエリ データの順序付け方法

このセクションでは、 Queryクラスの各 order-by メソッドによってデータがどのようにソートされるかについて説明します。

OrderByChild

OrderByChild()を使用すると、指定された子キーを含むデータは次のように並べられます。

  1. 指定された子キーのnull値を持つ子が最初に来ます。
  2. 指定された子キーの値がfalseの子が次に来ます。複数の子の値がfalseの場合、それらはキーによって辞書順にソートされます。
  3. 指定された子キーの値がtrueの子が次に来ます。複数の子の値がtrueの場合、それらは辞書式にキーでソートされます。
  4. 次に、数値を持つ子が昇順でソートされます。複数の子が指定された子ノードに対して同じ数値を持つ場合、それらはキーでソートされます。
  5. 文字列は数値の後に続き、辞書式に昇順にソートされます。指定された子ノードに対して複数の子が同じ値を持つ場合、それらはキーによって辞書順に並べられます。
  6. オブジェクトは最後に来て、キーの昇順で辞書式にソートされます。

OrderByKey

OrderByKey()を使用してデータを並べ替えると、データはキーの昇順で返されます。

  1. 32 ビット整数として解析できるキーを持つ子が最初に来て、昇順でソートされます。
  2. 次にキーとして文字列値を持つ子が来て、辞書式に昇順にソートされます。

OrderByValue

OrderByValue()を使用すると、子はその値によって並べ替えられます。順序付け基準は、指定された子キーの値の代わりにノードの値が使用されることを除いて、 OrderByChild()と同じです。