Unity | 파이어베이스 쓰기 정렬 필터링

Clean·2025년 7월 21일

Unity

목록 보기
24/24

오늘 배운 것

  • RunTransaction()

  • 이벤트

  • 데이터 정렬

  • 데이터 필터링

  • 보안 규칙


RunTransaction()

DatabaseReference reference = FirebaseManager.DB.RootReference;
reference.Child(user.UserId).RunTransaction(mutableData =>
{
	if (mutableData.Value == null)
	{
		Debug.Log($"데이터 없음 {mutableData.Value}");
		return TransactionResult.Success(mutableData);
	}

	Debug.Log($"데이터 있음 {mutableData.Value}");
	var data = mutableData.Value as Dictionary<string, object>;
	data["Hp"] = _changeHpValue;
	mutableData.Value = data;
	return TransactionResult.Success(mutableData);
});

동시에 수정하는 데이터일 때 사용

기존의 RunTransaction() 는 최상위 경로에서 시도했을 때는 값이 안받아와졌었는데,

UID로 폴더를 하나 추가한 뒤 시도하니 값이 제대로 받아와졌다.

FirebaseManager.DB.RootReference; 최상위 경로에서는 안되게 막아둔걸까?


이벤트

DatabaseReference userHp = reference.Child(user.UserId).Child("Hp");
userHp.ValueChanged += UserHp_ValueChanged;

void UserHp_ValueChanged(object sender, ValueChangedEventArgs e)
{
	DataSnapshot snapshot = e.Snapshot;
	if (snapshot == null || snapshot.Value == null || !snapshot.Exists)
	{
		Debug.Log("snapshot == null");
		return;
	}

	_testClass.Hp = (int)(long)snapshot.Value;
	Debug.Log($"체력 변경 {_testClass.Hp}");
}

ValueChanged 는 서버에서 값이 변경되었을 때 Invoke를 해주는 이벤트로,

OnEnable(), OnDisable() 에서 이벤트 등록과 등록취소를하여 사용하면 된다.

또한 이 이벤트는 변경되었을 때뿐만 아니라 이벤트를 등록했을 때도 한번 실행된다.

즉, 플레이어가 로그인을 했을 때 이벤트를 등록하면서 동기화를 하고,

그 이후부터는 값이 변경되었을 때마다 SetValueAsync() 함수로 서버에 변경을 신청하면

서버에서는 값을 수정하게 되고 동기화가 된다.

ValueChanged : 경로의 전체 내용에 대한 변경을 확인
ChildAdded : 경로의 하위 항목 추가를 확인
ChildChanged : 경로의 하위 항목 변경 사항을 확인
ChildRemoved : 경로의 하위 항목 삭제를 확인
ChildMoved : 경로의 하위 항목 순서 변경을 확인


데이터 정렬

reference.OrderByKey().GetValueAsync().ContinueWithOnMainThread(task =>
{
	// 키를 기준으로 정렬
    // 값을 기준으로 할 때는 OrderByValue()
});

데이터 정렬은 Query 클래스의 정렬 기준 함수를 사용하여 정렬할 수 있다.

출처


데이터 필터링

reference.OrderByKey().LimitToFirst(3).GetValueAsync().ContinueWithOnMainThread(task =>
{
	// 키를 기준으로 정렬하여 앞부터 3개 항목을 반환
});


Key가 정수일 때는 정렬 함수를 사용하면 정수타입이 아니라

string 타입으로 받아오기 때문에 그대로 받아와야 한다.

0개의 댓글