Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

데이터 검색

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

이 문서에서는 데이터 검색의 기본 사항과 Firebase 데이터를 정렬하고 필터링하는 방법을 다룹니다.

시작하기 전에

실시간 데이터베이스 를 사용하려면 먼저 다음을 수행해야 합니다.

  • Unity 프로젝트를 등록하고 Firebase를 사용하도록 구성합니다.

    • Unity 프로젝트에서 이미 Firebase를 사용하고 있다면 이미 Firebase용으로 등록 및 구성되어 있는 것입니다.

    • Unity 프로젝트가 없는 경우 샘플 앱 을 다운로드할 수 있습니다.

  • Firebase Unity SDK (특히 FirebaseDatabase.unitypackage )를 Unity 프로젝트에 추가합니다.

Unity 프로젝트에 Firebase를 추가하려면 Firebase 콘솔 과 열려 있는 Unity 프로젝트 모두의 작업이 필요합니다(예: 콘솔에서 Firebase 구성 파일을 다운로드한 다음 Unity 프로젝트로 이동).

데이터 검색

Firebase 데이터는 GetValueAsync()를 한 번 호출하거나 FirebaseDatabase 참조의 이벤트에 연결하여 검색합니다. 이벤트 리스너는 데이터의 초기 상태에 대해 한 번 호출되고 데이터가 변경될 때마다 다시 호출됩니다.

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

데이터를 한 번 읽기

GetValueAsync 메서드를 사용하여 지정된 경로에서 콘텐츠의 정적 스냅샷을 한 번 읽을 수 있습니다. 작업 결과에는 하위 데이터를 포함하여 해당 위치의 모든 데이터가 포함된 스냅샷이 포함됩니다. 데이터가 없으면 반환된 스냅샷은 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 항목 목록을 검색하거나 항목 목록에 대한 추가 사항을 수신합니다. 목록에 대한 변경 사항을 모니터링하기 위해 ChildChangedChildRemoved 와 함께 사용하는 것이 좋습니다.
ChildChanged 목록의 항목에 대한 변경 사항을 듣습니다. ChildAddedChildRemoved 와 함께 사용하여 목록에 대한 변경 사항을 모니터링합니다.
ChildRemoved 목록에서 제거되는 항목을 듣습니다. ChildAddedChildChanged 와 함께 사용하여 목록에 대한 변경 사항을 모니터링합니다.
ChildMoved 순서가 지정된 목록에서 항목 순서의 변경 사항을 수신합니다. ChildMoved 이벤트는 항상 항목의 순서를 변경한 ChildChanged 이벤트를 따릅니다(현재 주문 방법에 따라 다름).

ValueChanged 이벤트

ValueChanged 이벤트를 사용하여 주어진 경로에서 내용의 변경 사항을 구독할 수 있습니다. 이 이벤트는 리스너가 연결될 때 한 번 트리거되고 자식을 포함한 데이터가 변경될 때마다 다시 트리거됩니다. 이벤트 콜백에는 하위 데이터를 포함하여 해당 위치의 모든 데이터가 포함된 스냅샷이 전달됩니다. 데이터가 없으면 반환된 스냅샷은 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 이벤트는 각 기존 자식에 대해 한 번 발생한 다음 지정된 경로에 새 자식이 추가될 때마다 다시 발생합니다. 리스너는 새 하위 데이터가 포함된 스냅샷을 전달합니다.

ChildChanged 이벤트는 자식 노드가 수정될 때마다 발생합니다. 여기에는 자식 노드의 하위 항목에 대한 모든 수정 사항이 포함됩니다. 일반적으로 항목 목록의 변경 사항에 응답하기 위해 ChildAddedChildRemoved 이벤트와 함께 사용됩니다. 이벤트 리스너에 전달된 스냅샷에는 자식에 대한 업데이트된 데이터가 포함되어 있습니다.

ChildRemoved 이벤트는 직계 자식이 제거될 때 트리거됩니다. 일반적으로 ChildAddedChildChanged 콜백과 함께 사용됩니다. 이벤트 콜백에 전달된 스냅샷에는 제거된 자식에 대한 데이터가 포함됩니다.

ChildMoved 이벤트는 자식 재정렬을 유발하는 업데이트에 의해 ChildChanged 이벤트가 발생할 때마다 트리거됩니다. OrderByChild 또는 OrderByValue 로 정렬된 데이터와 함께 사용됩니다.

데이터 정렬 및 필터링

실시간 데이터베이스 Query 클래스를 사용하여 키, 값 또는 자식 값으로 정렬된 데이터를 검색할 수 있습니다. 정렬된 결과를 특정 결과 수 또는 키 또는 값 범위로 필터링할 수도 있습니다.

데이터 정렬

정렬된 데이터를 검색하려면 우선 순위 지정 방법 중 하나를 지정하여 결과가 정렬되는 방식을 결정합니다.

방법 용법
OrderByChild() 지정된 자식 키의 값으로 결과를 정렬합니다.
OrderByKey() 자식 키로 결과를 정렬합니다.
OrderByValue() 자식 값으로 결과를 정렬합니다.

한 번에 하나 의 주문 방식만 사용할 수 있습니다. 동일한 쿼리에서 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" 값에 따라 정렬됩니다. 다른 데이터 유형의 정렬 방식에 대한 자세한 내용은 쿼리 데이터 정렬 방식 을 참조하십시오.

데이터 필터링

데이터를 필터링하기 위해 쿼리를 구성할 때 제한 또는 범위 방법을 순서별 방법과 결합할 수 있습니다.

방법 용법
LimitToFirst() 정렬된 결과 목록의 시작 부분부터 반환할 최대 항목 수를 설정합니다.
LimitToLast() 정렬된 결과 목록의 끝에서 반환할 최대 항목 수를 설정합니다.
StartAt() 선택한 order-by 방법에 따라 지정된 키 또는 값보다 크거나 같은 항목을 반환합니다.
EndAt() 선택한 order-by 방법에 따라 지정된 키 또는 값보다 작거나 같은 항목을 반환합니다.
EqualTo() 선택한 order-by 방법에 따라 지정된 키 또는 값과 동일한 항목을 반환합니다.

order-by 방법과 달리 여러 제한 또는 범위 기능을 결합할 수 있습니다. 예를 들어 StartAt()EndAt() 메서드를 결합하여 지정된 값 범위로 결과를 제한할 수 있습니다.

쿼리에 대한 일치 항목이 하나만 있는 경우에도 스냅샷은 여전히 ​​목록입니다. 그것은 단지 하나의 항목을 포함합니다.

결과 수 제한

LimitToFirst()LimitToLast() 메서드를 사용하여 지정된 콜백에 대해 동기화할 최대 자식 수를 설정할 수 있습니다. 예를 들어 LimitToFirst() 를 사용하여 제한을 100으로 설정하면 처음에는 최대 100개의 ChildAdded 콜백만 수신합니다. Firebase 데이터베이스에 저장된 항목이 100개 미만인 경우 각 항목에 대해 ChildAdded 콜백이 실행됩니다.

항목이 변경되면 쿼리를 입력하는 항목에 대해 ChildAdded 콜백을 수신하고 쿼리에서 ChildRemoved 항목에 대해 ChildRemoved 콜백을 수신하여 총 수가 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( 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() 와 동일합니다.