在Firebase中通过电子邮件查找UID

use*_*721 3 ios firebase swift firebase-realtime-database

我首先尝试在数据库中实例化每个用户,如下所示:

emails : {
    email: "jerry@gmail.com" {
        uid: "x"
    }
}
Run Code Online (Sandbox Code Playgroud)

我很快发现我无法存储电子邮件,因为它有一个@..我本来打算做一个用户查找:

func userLookUpByEmail (email: String) -> String {
    var userID: String = "nil"

    ref.queryOrderedByChild("emails").queryEqualToValue(email).observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in
            if snapshot.value != nil {
                print(snapshot.value)
                userID = snapshot.value as! String
            }
            else {
                print ("user not found")
                userID = "nil"
            }
    })
    return userID
}
Run Code Online (Sandbox Code Playgroud)

但是,我意识到这是行不通的.从提供电子邮件接收UID的有效方法是什么?

ado*_*srs 5

回答您的问题,因为您不能将电子邮件作为子密钥,您可以采用其他方式,将uid设置为密钥,将电子邮件设置为子项.

emails : {
    uid: {
        email: "jerry@gmail.com"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你的代码会有所改变.

func userLookUpByEmail (email: String, completionHandler: (result: String) -> Void) {
    var userID: String = "nil"
    ref.child("emails").queryOrderedByChild("email").queryEqualToValue(email).observeSingleEventOfType(.ChildAdded, withBlock: { snapshot in
                if snapshot.value != nil {
                    print(snapshot.key)
                    userID = snapshot.key as! String
                }
                else {
                    print ("user not found")
                    userID = "nil"
                }
                completionHandler(userID)
        })
 }
Run Code Online (Sandbox Code Playgroud)

致电userLookUpByEmail:

userLookUpByEmail(email) {
    (result: String) in
    print("\(result)")
}
Run Code Online (Sandbox Code Playgroud)

另一方面,我想知道为什么emails你的数据库中有一个分支,因为你可以有一个users分支(如果你还没有)并在那里存储任何用户数据,包括电子邮件.这将使您的数据结构更加干净和可靠.再次,我在这里想,因为我不完全了解你的需求.

users : {
    uid: {
        email: "jerry@gmail.com",
        name: "Jerry Maguire",
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)