Swift 斯威夫特,火力基地。检查是否存在用户、儿童值

Swift 斯威夫特,火力基地。检查是否存在用户、儿童值,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,在我的游戏中,首先你必须登录,然后你必须选择一个团队名称,该名称存储在我的firebase数据库中,在玩家UID下,当玩家输入他的团队名称时,我想检查它是否已经被使用,或者玩家是否可以使用 let rootRef = FIRDatabase.database().reference() rootRef.queryOrderedByChild("teamName").queryEqualToValue("Bob fc").observeEventType(.Value, withBlock: {

在我的游戏中,首先你必须登录,然后你必须选择一个团队名称,该名称存储在我的firebase数据库中,在玩家UID下,当玩家输入他的团队名称时,我想检查它是否已经被使用,或者玩家是否可以使用

let rootRef = FIRDatabase.database().reference()
rootRef.queryOrderedByChild("teamName").queryEqualToValue("Bob fc").observeEventType(.Value, withBlock: { snapshot in

    if (snapshot.value is NSNull) {
        print("Name is not in use")
    } else {
        print("Name is in use")
    }   
})
我的数据树:

{
    "users" : {
        "pbXvXYOKmJQqwSQZ9IlBykG7x1P2" : {
             "teamName" : "Bob fc"
        }
    }
}
我的数据库规则:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

问题是它没有打印任何内容,我在这里做错了什么?

您正在查询根引用。您应该查询/users节点

let rootRef = FIRDatabase.database().reference()
let usersRef = rootRef.childByAppendingPath("users")
usersRef.queryOrderedBy....
你可以把它缩短,但为了清晰起见,我使用了详细的模型

作为补充说明,Firebase 3.x的默认设置是只允许经过身份验证的用户读写。这是通过实时数据库部分中的规则实现的

如果要在不进行身份验证的情况下测试代码,请将规则更改为

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

请注意:这会将您的数据开放给任何想要阅读它的人,但如果您只是在学习或测试一个应用程序,这会使它更方便。

您正在查询您的根引用。您应该查询/users节点,而我应该只查询rootRef.child(“用户”)。queryorder。。。然后呢?当然。我抛出了一个答案。它仍然没有打印任何东西-。-@Benja0906如果它没有打印任何东西,那么该块就不会被调用,或者你被拒绝访问。这将表明您的Firebase引用不正确,或者您在尝试读取时更有可能未通过身份验证。在Firebase 3.x中,默认设置是只允许经过身份验证的用户读写。检查Firebase控制台中的规则。我认为你是对的,它看起来根本不是在检查,我试图在observer中打印一个随机字符串,但从未打印出来。我编辑了我的问题,并写下了我的数据库规则,也许它们有问题,我真的不知道如何正确地编写规则。@Benja0906啊,是的-现在是你的问题了。查看我的更新答案-您可以复制/粘贴我为临时解决问题而编写的规则。