检查用户名是否已存在' s:Swift,Firebase

时间:2016-09-21 05:06:18

标签: ios swift firebase firebase-realtime-database

我试图检查用户名是否存在。当我调用queryOrderedBychild时,快照值始终可用,但它将打印出我的整个数据库,而不仅仅是我请求queryOrderby的数据。当我调用queryEqualToValue时,它总是返回null。我已经尝试了很多方法来解决这个问题。

这是我的代码:

DataService.instance.UsersRef.queryOrdered(byChild:"Nickname").queryEqual(toValue: "kai1004pro").observe(.value, with: { (snapshot) in

        if (snapshot.value is NSNull) {
            print("not found")
        } else {
            print("found")
            print(snapshot.value)
        }




    })

这是我的json树:

Optional({
g50X0FvEsSO4L457v7NzS3dAABl1 =     {
    "User Profile" =         {
        Birthday = "Sep 20, 1992";
        Gender = Female;
        Nickname = kai1004pro;
        UserUID = g50X0FvEsSO4L457v7NzS3dAABl1;
        emailAddress = "poqksbs@gmail.con";
        isFollow = 0;
        isFriend = 0;
    };
};
})

这是安全规则:

"rules": {
".read": true,
".write": "auth != null",
"Users": {
  ".read": true,
  ".write": "auth != null",
  ".indexOn": ["Nickname", "User Profile"]
    }
  }
}

1 个答案:

答案 0 :(得分:2)

修改 JSON 树以包含一个单独的节点active_usernames,每当您创建新用户时添加每个用户的用户名,每当您的用户修改其用户名时进行修改...

myApp:{
  users:{
    uid1:{....},
    uid2:{....},
    uid3:{....},
    uid4:{....},
  }
active_usernames :{
    uid1username : "true",
    uid2username : "true",
    uid3username : "true",
    uid4username : "true"
    }
}

检查您的用户名是否已存在: -

//Checking username existence
FIRDatabase.database().reference().child("active_usernames").child(self.enteredUsername.text!).observeSingleEvent(of: .value, with: {(usernameSnap) in

        if usernameSnap.exists(){
        //This username already exists

        }else{

        //Yippee!.. This can be my username
        }

    })

通过操纵安全规则,还可以将安全规则更改为对所有人的可读 (只有可读)

{rules :{

   active_usernames : {

      ".read" : "true",
      ".write" : "auth != null"

      }
    }
   }

PS: - enteredUsername是您输入用户名的textField。

建议:将检查代码保留在textField的 didChangeEditing 事件中(为了更好的用户体验。!)