swift - 使用 Swift 在 Firebase 中通过给定的电子邮件获取用户的 uid

标签 swift firebase firebase-realtime-database swift4

我必须通过提供电子邮件来获取用户 ID。我的结构是:

users
    -Wc1EtcYzZSMPCtWZ8wRb8RzNXqg2
        -email: "batuarslan@gmail.com"
        -lists
            slid: "-LJsrWDfMPNcs_NjVYBM"
            uid:  "Wc1EtcYzZSMPCtWZ8wRb8RzNXqg2"

有没有办法做到这一点?还是我必须以另一种方式重组我的树?我的代码:

func userLookUpByEmail (email: String, completionHandler: @escaping (_ result: String) -> Void) {
    var userId : String = ""

    usersRef.queryOrdered(byChild: "email").queryEqual(toValue: email).observeSingleEvent(of: .value, with: { snapshot in
        if snapshot.value != nil {
            userId = snapshot.key
        }
        else {
            userId = "nil"
        }
        completionHandler(userId)
    })
}

func userLookUpByEmail (email: String, completionHandler: @escaping (_ result: String) -> Void) {
    var userId : String = ""

    usersRef.queryOrdered(byChild: "email")
            .queryEqual(toValue: email)
            .observeSingleEvent(of: .value, with: { snapshot in

        if snapshot.value != nil {
            userId = snapshot.key
        }
        else {
            userId = "nil"
        }
        completionHandler(userId)
        })
    }

最佳答案

Firebase 数据库结构文档建议采用具有两个定向条目的平面结构,这可以添加冗余以加快查找速度。

请参阅 https://firebase.google.com/docs/database/ios/structure-data 中的链接“创建可扩展的数据”

为了以高效的方式扩展,应该添加类似于“SQL 中的外键”的两种方式条目以及索引。

例如,在您的情况下: 您在显示的代码中尝试执行的操作没有任何问题。但是为了扩展它,添加一个新节点 emailhashes(因为电子邮件不能用作节点/子节点)最好与您的用户节点同级。这个 emailhashes 节点应该存储 emailhash 到 uid 的映射。

users
-Wc1EtcYzZSMPCtWZ8wRb8RzNXqg2
    -email: "batuarslan@gmail.com"
    -lists
        slid: "-LJsrWDfMPNcs_NjVYBM"
        uid:  "Wc1EtcYzZSMPCtWZ8wRb8RzNXqg2"
 ...
 ...

 ...
emails
 -<md5 hash of "batuarslan@gmail.com">: "Wc1EtcYzZSMPCtWZ8wRb8RzNXqg2"
...
...

...

因此,lookupByEmail 应该首先为输入的电子邮件生成 md5 哈希,并在 emailhashes 节点中查找 emailhash 以获取相应的 uid,然后使用 lookupByUID 可以获取用户数据。

生成邮件的md5 hash,请引用:How to convert string to MD5 hash using ios swift

在 firebase 实时数据库上建立索引是通过应用数据库规则来完成的。请引用:

https://firebase.google.com/docs/database/security/indexing-data

关于swift - 使用 Swift 在 Firebase 中通过给定的电子邮件获取用户的 uid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51844316/

相关文章:

ios - 如何在 ios 中集成原生 facebook (swift)

javascript - 使用 Promise 传递参数 VUE

android - Firebase 数据库无法更新

ios - 在 iOS 上使用 Swift 将 NaN 存储在 Firebase 中

swift - 如何在 Swift 中限制字符串或属性字符串中的字符数

ios - 如何升级sqlite中的数据库版本并在swift中的表中添加新列

ios - swift : Cannot convert value of type '()' to expected argument type '[Double]'

ios - 在 iOS 的 firebase 数据库中查询

json - Flutter实时数据库onValue解析

android - E/炸药模块 : Failed to load module descriptor class: Didn't find class