Ios swift中现有用户的Firebase检查

Ios swift中现有用户的Firebase检查,ios,swift,firebase,Ios,Swift,Firebase,我有一个VC,我正在创建一个新用户并添加到firebase。用户在数据库中插入没有问题,但是我在检查同名用户是否已经存在时遇到问题。我曾尝试在firebase中使用各种查询语句,但没有得到任何乐趣。有人知道我如何修改代码来实现这一点吗?这是:- @IBAction func submitUsername(sender: AnyObject) { if let user = usernameTxtField.text where user != "" { let use

我有一个VC,我正在创建一个新用户并添加到firebase。用户在数据库中插入没有问题,但是我在检查同名用户是否已经存在时遇到问题。我曾尝试在firebase中使用各种查询语句,但没有得到任何乐趣。有人知道我如何修改代码来实现这一点吗?这是:-

 @IBAction func submitUsername(sender: AnyObject) {

    if let user = usernameTxtField.text where user != "" {

       let username = DataService.ds.REF_USERS.childByAppendingPath("username")

       username.observeSingleEventOfType(.Value, withBlock: {  snap in

            if let usernameDoesNotExist = snap.value as? NSNull {
              let currentUser = DataService.ds.REF_USER_CURRENT.childByAppendingPath("username")
              self.usernameTxtField.text = user
              currentUser.setValue(user)
            }
       })

       dismissViewControllerAnimated(true, completion: nil)

    } else {
        showAlert("Username Needed", msg: "please choose a username")
    } 
}
以及firebase数据结构

"users" : {
    "000591b6-ba88-4670-9cb7-edd79c273eab" : {
      "newuser" : "added to FB",
      "provider" : "password"
    },
    "05551c90-27fe-4969-b45d-279a72583857" : {
      "newuser" : "added to FB",
      "provider" : "password"
    },
    "0bbff1b0-681a-4fef-adc0-c4779a4b2100" : {
      "provider" : "password",
      "testing" : "emailtest",
      "username" : "richy446"
    },
    "12f35e7a-2430-49b3-a287-f7b1daf6a121" : {
      "newuser" : "added to FB",
      "provider" : "password",
      "username" : "richy445"
    },
    "15a45560-cc81-4c2d-bb59-b8ce6b125d68" : {
      "provider" : "password",
      "testing" : "emailtest",
      "username" : "richy445"
    },
    "1c135936-6dd0-4189-bcd7-e8036e9736f9" : {
      "newuser" : "added to FB",
      "provider" : "password"
    },
    "21591e29-f083-452c-b74f-cc567cecb183" : {
      "newuser" : "added to FB",
      "provider" : "password"
    },
    "8b385aa7-0e80-426b-a385-5b3317c894d0" : {
      "newuser" : "added to FB",
      "provider" : "password",
      "username" : "richy445"
    }
}

检查重复数据有多种方法。您使用的Firebase结构似乎有点不一致,因此这样构造可能更容易

"000591b6-ba88-4670-9cb7-edd79c273eab" : {
      "email" : "test@test.com",
      "password" : "password"
    },
"05551c90-27fe-4969-b45d-279a72583857" : {
      "email" : "test2@test.com",
      "password" : "password"
    },
1) 让Firebase为您完成这项工作

创建用户时,如果用户名(电子邮件)已存在,Firebase将返回错误。在firebase中创建帐户之前,使用此方法将防止将随机数据写入firebase

myRootRef.createUser(email, password: pw, withValueCompletionBlock: { error, result in

    if error != nil {
        self.errMsgField.stringValue = "email/username in use, try again"

    } else {
        let uid = result["uid"] as! String //the uid of the new user
        print("user created as  \(uid)")
        self.storedDataInUserNode(email, password:pw)
        self.authUserWithAuthData( email, password: pw ) //auth the user
        // and proceed in starting up the app
    }
})
2) 正在检查Firebase中的现有数据

myRootRef.createUser(email, password: pw, withValueCompletionBlock: { error, result in

    if error != nil {
        self.errMsgField.stringValue = "email/username in use, try again"

    } else {
        let uid = result["uid"] as! String //the uid of the new user
        print("user created as  \(uid)")
        self.storedDataInUserNode(email, password:pw)
        self.authUserWithAuthData( email, password: pw ) //auth the user
        // and proceed in starting up the app
    }
})
当第一种方法首先停止写入数据时,如果您想检查重复数据,通常有一种模式:

let userName = the userName or email the user entered
let usersRef = Firebase(url:"https://test.firebaseio.com/users")
usersRef.queryOrderedByChild("email").queryEqualToValue("\(userName!)")
            .observeSingleEventOfType(.Value, withBlock: { snapshot in

        if ( snapshot.value is NSNull ) {
            print("not found)") //didnt find it, ok to proceed

        } else {
            print(snapshot.value) //found it, stop!
        }
 }

DataSnapshot上有一个名为.exists()的方法,可以这样调用。 更新为Swift 4

struct ModelUser {
    var id: String
    var name: String

    init(data: DataSnapshot) {
        // do init stuff
    }
}

func isUserRegistered(with id: String, completion: @escaping (_ exists: Bool, _ user: ModelUser?) -> ()) {
    DatabaseReference.users.child(id).observeSingleEvent(of: .value) { (snapshot) in
        if snapshot.exists() {
            // user is already in our database
            completion(true, ModelUser(data: snapshot))
        } else {
            // not in database
            completion(false, nil)
        }
    }
}

您是询问如何检查Firebase中是否存在用户名(即登录凭据),还是询问如何查看/users节点中是否存在用户名?另外,发布你的Firebase结构(文本,请不要图片)有助于我们了解你的结构,并澄清你的问题。mainDict->posts->users->username这就是Firebase的结构,在username中,我想向我正在做的数据库添加一个用户,但如果已经使用了用户名,我不想添加用户(可能会显示某种类型的消息警报)这不是一个很好的存储用户名的结构。/users的子节点应该是uid,而该节点的子节点应该是用户名:“用户名”作为键:值对。这可能会导致其他问题,因为用户节点是posts节点的子节点。能否请您使用Firebase结构更新您的问题?这将使我们不必重新键入,也将澄清问题和问题。只是添加了它,希望在检查了name可用。关闭…请以文本形式发布(根据我上面的评论),而不是图像,这样我们就不必重新键入它。当您以文本形式发布时,它是可搜索的(图像不是),并将在将来帮助其他人。