来自 Firebase Unity 中相同 child 的不同值
Different value from the same child in Firebase Unity
当我在 Unity 编辑器中开始游戏时,我从 DB (Realtime DB Firebase) 获取浮点值并在控制台中弹出它。
问题:值有时不同。当在数据库中时,它是 1,我从数据库中得到 4。我运行TryDownloadData
方法下载数据打印出来
数据库结构很简单:
{
"users" : {
"5bf700187027d43cc8295afb69cc4495aecff695" : {
"gravitationalAcceleration" : -9.8100004196167
}
}
}
用户class:
public class User
{
public float gravitationalAcceleration;
public User(float gravitationalAcceleration)
{
this.gravitationalAcceleration = gravitationalAcceleration;
}
}
最后 class 连接到数据库并获取 gravitationalAcceleration
值。
public class Firebase : MonoBehaviour
{
private string userID;
private DatabaseReference dbReference;
private void Awake()
{
userID = SystemInfo.deviceUniqueIdentifier;
dbReference = FirebaseDatabase.DefaultInstance.RootReference;
StartCoroutine(TryDownloadData());
}
public void CreateUser()
{
User user = new User(Physics.gravity.y);
string json = JsonUtility.ToJson(user);
dbReference.Child("users").Child(userID).SetRawJsonValueAsync(json);
print("New user created");
}
public void TrySendData(User user)
{
StartCoroutine(SendData(user));
}
private IEnumerator SendData(User user)
{
string json = JsonUtility.ToJson(user);
var task = dbReference.Child("users").Child(userID).SetRawJsonValueAsync(json);
yield return new WaitUntil(() => task.IsCompleted);
if (task.Exception != null)
{
print("Exception uploading data!");
print(task.Exception);
}
print("Data sent!");
}
private IEnumerator TryDownloadData()
{
var task = dbReference.Child("users").GetValueAsync();
yield return new WaitUntil(() => task.IsCompleted);
if (task.Exception != null)
{
print("Exception while downloading data!");
print(task.Exception);
}
if (task.Result.Value == null)
{
print("No info from DB");
CreateUser();
}
else
{
print("Got Data!");
DataSnapshot snapshot = task.Result;
if (snapshot.Child(userID).Exists)
{
var val = float.Parse(snapshot.Child(userID).Child("gravitationalAcceleration").Value.ToString());
Debug.Log("User exists. The value " + val);
}
else
{
Debug.Log("User does not exist");
CreateUser();
}
}
}
}
您需要初始化 Firebase。之后它开始工作正常! (返回正确值)
private string userID;
private DatabaseReference dbReference;
private void Start()
{
Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task =>
{
if (task.Exception != null)
{
Debug.Log("Init Exception! " + task.Exception);
return;
}
userID = SystemInfo.deviceUniqueIdentifier;
dbReference = FirebaseDatabase.DefaultInstance.RootReference;
//OnInit?.Invoke();
Debug.Log("Firebase initialized!");
TryLogin();
});
}
当我在 Unity 编辑器中开始游戏时,我从 DB (Realtime DB Firebase) 获取浮点值并在控制台中弹出它。
问题:值有时不同。当在数据库中时,它是 1,我从数据库中得到 4。我运行TryDownloadData
方法下载数据打印出来
数据库结构很简单:
{
"users" : {
"5bf700187027d43cc8295afb69cc4495aecff695" : {
"gravitationalAcceleration" : -9.8100004196167
}
}
}
用户class:
public class User
{
public float gravitationalAcceleration;
public User(float gravitationalAcceleration)
{
this.gravitationalAcceleration = gravitationalAcceleration;
}
}
最后 class 连接到数据库并获取 gravitationalAcceleration
值。
public class Firebase : MonoBehaviour
{
private string userID;
private DatabaseReference dbReference;
private void Awake()
{
userID = SystemInfo.deviceUniqueIdentifier;
dbReference = FirebaseDatabase.DefaultInstance.RootReference;
StartCoroutine(TryDownloadData());
}
public void CreateUser()
{
User user = new User(Physics.gravity.y);
string json = JsonUtility.ToJson(user);
dbReference.Child("users").Child(userID).SetRawJsonValueAsync(json);
print("New user created");
}
public void TrySendData(User user)
{
StartCoroutine(SendData(user));
}
private IEnumerator SendData(User user)
{
string json = JsonUtility.ToJson(user);
var task = dbReference.Child("users").Child(userID).SetRawJsonValueAsync(json);
yield return new WaitUntil(() => task.IsCompleted);
if (task.Exception != null)
{
print("Exception uploading data!");
print(task.Exception);
}
print("Data sent!");
}
private IEnumerator TryDownloadData()
{
var task = dbReference.Child("users").GetValueAsync();
yield return new WaitUntil(() => task.IsCompleted);
if (task.Exception != null)
{
print("Exception while downloading data!");
print(task.Exception);
}
if (task.Result.Value == null)
{
print("No info from DB");
CreateUser();
}
else
{
print("Got Data!");
DataSnapshot snapshot = task.Result;
if (snapshot.Child(userID).Exists)
{
var val = float.Parse(snapshot.Child(userID).Child("gravitationalAcceleration").Value.ToString());
Debug.Log("User exists. The value " + val);
}
else
{
Debug.Log("User does not exist");
CreateUser();
}
}
}
}
您需要初始化 Firebase。之后它开始工作正常! (返回正确值)
private string userID;
private DatabaseReference dbReference;
private void Start()
{
Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task =>
{
if (task.Exception != null)
{
Debug.Log("Init Exception! " + task.Exception);
return;
}
userID = SystemInfo.deviceUniqueIdentifier;
dbReference = FirebaseDatabase.DefaultInstance.RootReference;
//OnInit?.Invoke();
Debug.Log("Firebase initialized!");
TryLogin();
});
}