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 타입으로 받아오기 때문에 그대로 받아와야 한다.