如何检查Unity中Firebase数据库中是否已存在键/值

时间:2018-09-25 11:30:13

标签: c# firebase unity3d firebase-realtime-database

在过去的一周中,我一直在寻找很多这个问题,但是我能找到的只是这个问题的答案,但是是针对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对象,我根据结果添加侦听器以执行操作。

我正在制作一个简单的在线记分板,但出于物流目的,我不希望两个人在记分板上使用相同的用户名,因此在允许用户使用该用户名之前,我要先检查用户名是否存在。< / p>

这是我在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轻松实现此目标的任何想法?

谢谢。

1 个答案:

答案 0 :(得分:2)

我实际上找到了一个简单的解决方案。问题在于,无论数据实际上是否存在于数据库中,因为要向其传递搜索键,所以快照永远不会为空。

尽管如此,快照对象中还是有很多数据:.Exists。这将告诉您查询实际上是否在数据库中。