在过去的一周里,我一直在搜索这个问题,但是我只能找到针对Android Firebase API的同样问题的答案,这与Unity的不同。
以下是我正在尝试使用的代码,以查看用户名/值是否已经存在于数据库中:
public void CheckIfUsernameExists(string nick)
{
System.Threading.Tasks.Task t = db.Child("userinfo").Child(nick).GetValueAsync().ContinueWith(task =>
{
if (task.IsFaulted)
{
Debug.LogError(task.Result.ToString() + "faulted");
usernameExists = false;
usernameNotExistsEvent.Invoke();
}
else if (task.IsCompleted)
{
DataSnapshot snapshot = task.Result;
if (snapshot != null)
{
usernameExists = true;
Debug.LogError(task.Result.ToString() + "completed");
usernameExistsEvent.Invoke();
}
else
{
Debug.LogError(task.Result.ToString() + "elsecompleted");
usernameNotExistsEvent.Invoke();
}
}
else if (task.IsCanceled)
{
Debug.LogError(task.Result.ToString() + "canceled");
usernameNotExistsEvent.Invoke();
}
});
}
其中,usernameExistsEvent和usernameNotExistsEvent是UnityEvent对象,我向它们添加侦听器以根据结果执行相应操作。
我正在制作一个简单的在线积分榜,但出于后勤目的,我不希望两个人在积分榜上使用相同的用户名,因此在允许用户使用之前会检查该用户名是否存在。
以下是我在Firebase上制定的规则:
{
"rules": {
"scores": {
".read": "data.child(auth.uid).exists()",
"$user_id": {
".write":"$user_id === auth.uid"
}
},
"userinfo": {
"$user_id": {
".write":"!data.exists()",
".read": "true"
}
}
}
}
出于某种奇怪的原因,即使用户名不存在,任务也会被标记为已完成,因此我的代码实际上并不起作用。
有没有什么简单的方法在 Firebase 上完成这个任务?
提前感谢您。
DataSnapshot
确实永远不会是null
。如果快照中没有数据,则其Exists
属性将为false以指示此情况。 - Frank van Puffelen