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

4

在过去的一周里,我一直在搜索这个问题,但是我只能找到针对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 上完成这个任务?

提前感谢您。

1个回答

3
我找到了一个简单的解决方案。问题在于,无论数据是否实际存在于数据库中,由于您传递了一个用于搜索的键,快照将永远不会为空。
但是,快照对象中有一个很好的数据: .Exists。这将告诉您查询是否实际在数据库中。

很高兴听到你找到了解决方案,恩里克,谢谢你的分享。DataSnapshot确实永远不会是null。如果快照中没有数据,则其Exists属性将为false以指示此情况。 - Frank van Puffelen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接