이 문서에서는 데이터 검색의 기본 사항과 Firebase 데이터를 정렬하고 필터링하는 방법을 다룹니다.
시작하기 전에
Get Started
가이드에서 설명한 대로 앱을 설정하고 데이터베이스에 액세스할 수 있는지 확인하세요.
데이터 검색
Firebase 데이터는 GetValue()
를 한 번 호출하거나 FirebaseDatabase
참조의 ValueListener
에 연결하여 검색됩니다. 값 수신기는 데이터의 초기 상태에 대해 한 번 호출되고 데이터가 변경될 때마다 다시 호출됩니다.
데이터베이스 참조 가져오기
데이터베이스에 데이터를 쓰려면 DatabaseReference
인스턴스가 필요합니다.
// Get the root reference location of the database. firebase::database::DatabaseReference dbref = database->GetReference();
데이터 한 번 읽기
GetValue()
메서드를 사용하여 지정된 경로에서 콘텐츠의 정적 스냅샷을 한 번 읽을 수 있습니다. 작업 결과에는 하위 데이터를 포함하여 해당 위치의 모든 데이터가 포함된 스냅샷이 포함됩니다. 데이터가 없으면 반환된 스냅샷은 null
입니다.
firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("Leaders").GetValue();
요청이 이루어진 시점에서 값을 읽기 전에 Future가 완료될 때까지 기다려야 합니다. 게임은 일반적으로 루프에서 실행되고 다른 애플리케이션보다 덜 콜백 구동되므로 일반적으로 완료를 위해 폴링합니다.
// In the game loop that polls for the result... if (result.status() != firebase::kFutureStatusPending) { if (result.status() != firebase::kFutureStatusComplete) { LogMessage("ERROR: GetValue() returned an invalid result."); // Handle the error... } else if (result.error() != firebase::database::kErrorNone) { LogMessage("ERROR: GetValue() returned error %d: %s", result.error(), result.error_message()); // Handle the error... } else { firebase::database::DataSnapshot snapshot = result.result(); // Do something with the snapshot... } }
이것은 몇 가지 기본적인 오류 검사를 보여줍니다. 오류 검사에 대한 자세한 내용과 결과가 언제 준비되었는지 확인하는 방법은 firebase::Future 참조를 확인하세요.
이벤트 듣기
데이터 변경 사항을 구독할 리스너를 추가할 수 있습니다.
ValueListener
기본 클래스
콜백 | 일반적인 사용법 |
---|---|
OnValueChanged | 경로의 전체 내용에 대한 변경 사항을 읽고 듣습니다. |
OnChildListener
기본 클래스
OnChildAdded | 항목 목록을 검색하거나 항목 목록에 대한 추가 사항을 수신합니다. 목록에 대한 변경 사항을 모니터링하기 위해 OnChildChanged 및 OnChildRemoved 와 함께 사용하는 것이 좋습니다. |
OnChildChanged | 목록의 항목에 대한 변경 사항을 수신합니다. OnChildRemoved OnChildAdded 함께 사용하여 목록 변경 사항을 모니터링합니다. |
OnChildRemoved | 목록에서 제거되는 항목을 수신합니다. OnChildChanged OnChildAdded 함께 사용하여 목록 변경 사항을 모니터링합니다. |
OnChildMoved | 순서가 지정된 목록의 항목 순서에 대한 변경 사항을 수신합니다. OnChildMoved 콜백은 항목의 순서 변경(현재 order-by 메서드 기반)으로 인해 항상 OnChildChanged 콜백을 따릅니다. |
ValueListener 클래스
OnValueChanged
콜백을 사용하여 지정된 경로의 내용에 대한 변경 사항을 구독할 수 있습니다. 이 콜백은 리스너가 연결될 때 한 번 트리거되고 자식을 포함한 데이터가 변경될 때마다 다시 트리거됩니다. 콜백은 하위 데이터를 포함하여 해당 위치의 모든 데이터를 포함하는 스냅샷으로 전달됩니다. 데이터가 없으면 반환된 스냅샷은 null
입니다.
다음 예제는 데이터베이스에서 순위표 점수를 검색하는 게임을 보여줍니다.
class LeadersValueListener : public firebase::database::ValueListener { public: void OnValueChanged( const firebase::database::DataSnapshot& snapshot) override { // Do something with the data in snapshot... } void OnCancelled(const firebase::database::Error& error_code, const char* error_message) override { LogMessage("ERROR: LeadersValueListener canceled: %d: %s", error_code, error_message); } }; // Elsewhere in the code... LeadersValueListener* listener = new LeadersValueListener(); firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("Leaders").AddValueListener(listener);
Future<DataSnaphot>
결과에는 이벤트 발생 시 데이터베이스의 지정된 위치에 있는 데이터가 포함됩니다. 스냅샷에서 value()
를 호출하면 데이터를 나타내는 Variant
가 반환됩니다.
이 예제에서는 읽기가 취소되었는지 확인하기 위해 OnCancelled
메서드도 재정의됩니다. 예를 들어 클라이언트에 Firebase 데이터베이스 위치에서 읽을 수 있는 권한이 없는 경우 읽기를 취소할 수 있습니다. database::Error
는 실패가 발생한 이유를 나타냅니다.
ChildListener 클래스
자식 이벤트는 PushChild()
메서드를 통해 추가된 새 자식 또는 UpdateChildren()
메서드를 통해 업데이트되는 자식과 같은 작업에서 노드의 자식에 발생하는 특정 작업에 대한 응답으로 트리거됩니다. 이들 각각은 데이터베이스의 특정 노드에 대한 변경 사항을 수신하는 데 유용할 수 있습니다. 예를 들어 게임은 이러한 방법을 함께 사용하여 아래와 같이 게임 세션의 댓글 활동을 모니터링할 수 있습니다.
class SessionCommentsChildListener : public firebase::database::ChildListener { public: void OnChildAdded(const firebase::database::DataSnapshot& snapshot, const char* previous_sibling) override { // Do something with the data in snapshot ... } void OnChildChanged(const firebase::database::DataSnapshot& snapshot, const char* previous_sibling) override { // Do something with the data in snapshot ... } void OnChildRemoved( const firebase::database::DataSnapshot& snapshot) override { // Do something with the data in snapshot ... } void OnChildMoved(const firebase::database::DataSnapshot& snapshot, const char* previous_sibling) override { // Do something with the data in snapshot ... } void OnCancelled(const firebase::database::Error& error_code, const char* error_message) override { LogMessage("ERROR: SessionCommentsChildListener canceled: %d: %s", error_code, error_message); } }; // elsewhere .... SessionCommentsChildListener* listener = new SessionCommentsChildListener(); firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("GameSessionComments").AddChildListener(listener);
OnChildAdded
콜백은 일반적으로 Firebase 데이터베이스의 항목 목록을 검색하는 데 사용됩니다. OnChildAdded
콜백은 각 기존 자식에 대해 한 번 호출된 다음 새 자식이 지정된 경로에 추가될 때마다 다시 호출됩니다. 리스너는 새 하위 데이터가 포함된 스냅샷을 전달받습니다.
OnChildChanged
콜백은 자식 노드가 수정될 때마다 호출됩니다. 여기에는 자식 노드의 자손에 대한 모든 수정 사항이 포함됩니다. 일반적으로 항목 목록의 변경 사항에 응답하기 위해 OnChildRemoved
OnChildAdded
과 함께 사용됩니다. 수신기에 전달된 스냅샷에는 자식에 대한 업데이트된 데이터가 포함됩니다.
OnChildRemoved
콜백은 직계 자식이 제거될 때 트리거됩니다. 일반적으로 OnChildChanged
OnChildAdded
과 함께 사용됩니다. 콜백에 전달된 스냅샷에는 제거된 자식에 대한 데이터가 포함됩니다.
OnChildMoved
콜백은 OnChildChanged
호출이 자식의 재정렬을 유발하는 업데이트에 의해 발생할 때마다 트리거됩니다. OrderByChild
또는 OrderByValue
로 주문된 데이터와 함께 사용됩니다.
데이터 정렬 및 필터링
실시간 데이터베이스 Query
클래스를 사용하여 키, 값 또는 자식 값별로 정렬된 데이터를 검색할 수 있습니다. 정렬된 결과를 특정 수의 결과 또는 키 또는 값 범위로 필터링할 수도 있습니다.
데이터 정렬
정렬된 데이터를 검색하려면 order-by 메서드 중 하나를 지정하여 결과 정렬 방식을 결정합니다.
방법 | 용법 |
---|---|
OrderByChild() | 지정된 자식 키의 값에 따라 결과를 정렬합니다. | OrderByKey() | 하위 키별로 결과를 정렬합니다. |
OrderByValue() | 하위 값을 기준으로 결과를 정렬합니다. |
한 번에 하나 의 주문 기준 방법만 사용할 수 있습니다. 동일한 쿼리에서 order-by 메서드를 여러 번 호출하면 오류가 발생합니다.
다음 예는 점수별로 정렬된 점수 순위표를 구독하는 방법을 보여줍니다.
firebase::database::Query query = dbRef.GetReference("Leaders").OrderByChild("score"); // To get the resulting DataSnapshot either use query.GetValue() and poll the // future, or use query.AddValueListener() and register to handle the // OnValueChanged callback.
이것은 ValueListener 와 결합될 때 각 항목의 점수에 따라 정렬된 데이터베이스의 순위표와 클라이언트를 동기화하는 firebase::Query
를 정의합니다. 데이터를 효율적으로 구조화하는 방법에 대한 자세한 내용은 데이터베이스 구조화 에서 확인할 수 있습니다.
OrderByChild()
메서드에 대한 호출은 결과를 정렬할 자식 키를 지정합니다. 이 경우 결과는 각 하위 항목의 "score"
값을 기준으로 정렬됩니다. 다른 데이터 유형의 정렬 방법에 대한 자세한 내용은 쿼리 데이터 정렬 방법 을 참조하십시오.
데이터 필터링
데이터를 필터링하려면 쿼리를 구성할 때 제한 또는 범위 방법을 order-by 방법과 결합할 수 있습니다.
방법 | 용법 |
---|---|
LimitToFirst() | 정렬된 결과 목록의 시작 부분에서 반환할 최대 항목 수를 설정합니다. |
LimitToLast() | 정렬된 결과 목록의 끝에서 반환할 최대 항목 수를 설정합니다. |
StartAt() | 선택한 order-by 방법에 따라 지정된 키 또는 값보다 크거나 같은 항목을 반환합니다. |
EndAt() | 선택한 order-by 방법에 따라 지정된 키 또는 값보다 작거나 같은 항목을 반환합니다. |
EqualTo() | 선택한 order-by 방법에 따라 지정된 키 또는 값과 동일한 항목을 반환합니다. |
order-by 방법과 달리 여러 제한 또는 범위 기능을 결합할 수 있습니다. 예를 들어 StartAt()
및 EndAt()
메서드를 결합하여 지정된 값 범위로 결과를 제한할 수 있습니다.
쿼리와 일치하는 항목이 하나뿐인 경우에도 스냅샷은 여전히 목록입니다. 그것은 단지 하나의 항목을 포함합니다.
결과 수 제한
LimitToFirst()
및 LimitToLast()
메서드를 사용하여 지정된 콜백에 대해 동기화할 최대 자식 수를 설정할 수 있습니다. 예를 들어 LimitToFirst()
를 사용하여 제한을 100으로 설정하면 처음에는 최대 100개의 OnChildAdded
콜백만 수신합니다. Firebase 데이터베이스에 저장된 항목이 100개 미만인 경우 각 항목에 대해 OnChildAdded
콜백이 실행됩니다.
항목이 변경되면 쿼리를 입력하는 항목에 대한 OnChildRemoved
콜백과 쿼리에서 제외되는 항목에 대한 OnChildAdded
콜백을 수신하여 총 수가 100으로 유지됩니다.
예를 들어 아래 코드는 순위표에서 최고 점수를 반환합니다.
firebase::database::Query query = dbRef.GetReference("Leaders").OrderByChild("score").LimitToLast(1); // To get the resulting DataSnapshot either use query.GetValue() and poll the // future, or use query.AddValueListener() and register to handle the // OnValueChanged callback.
키 또는 값으로 필터링
StartAt()
, EndAt()
및 EqualTo( EqualTo()
를 사용하여 쿼리에 대한 임의의 시작, 종료 및 등가점을 선택할 수 있습니다. 이는 데이터에 페이지를 매기거나 특정 값을 가진 자식이 있는 항목을 찾는 데 유용할 수 있습니다.
쿼리 데이터 정렬 방식
이 섹션에서는 Query
클래스의 각 order-by 메서드별로 데이터를 정렬하는 방법에 대해 설명합니다.
OrderByChild
OrderByChild()
를 사용할 때 지정된 하위 키를 포함하는 데이터는 다음과 같이 정렬됩니다.
- 지정된 자식 키에 대해
null
값이 있는 자식이 먼저 옵니다. - 지정된 하위 키에 대해 값이
false
인 하위가 다음에 옵니다. 여러 자식의 값이false
인 경우 키를 기준으로 사전순 으로 정렬됩니다. - 지정된 자식 키에 대해
true
값을 가진 자식이 다음에 옵니다. 여러 자식의 값이true
인 경우 키를 기준으로 사전순으로 정렬됩니다. - 숫자 값이 있는 하위 항목은 오름차순으로 정렬되어 다음에 옵니다. 여러 자식이 지정된 자식 노드에 대해 동일한 숫자 값을 갖는 경우 키별로 정렬됩니다.
- 문자열은 숫자 다음에 오며 사전순으로 오름차순으로 정렬됩니다. 여러 자식이 지정된 자식 노드에 대해 동일한 값을 갖는 경우 키를 기준으로 사전순으로 정렬됩니다.
- 객체는 마지막에 오름차순으로 키별로 사전순으로 정렬됩니다.
OrderByKey
OrderByKey()
를 사용하여 데이터를 정렬하면 데이터가 키를 기준으로 오름차순으로 반환됩니다.
- 32비트 정수로 구문 분석할 수 있는 키가 있는 자식이 먼저 오름차순으로 정렬됩니다.
- 키로 문자열 값이 있는 자식이 다음에 오며 사전순으로 오름차순으로 정렬됩니다.
OrderByValue
OrderByValue()
를 사용할 때 자식은 해당 값에 따라 정렬됩니다. 순서 지정 기준은 OrderByChild()
와 동일하지만 지정된 하위 키 값 대신 노드 값이 사용됩니다.