【问题标题】:Get uid of a user by a given email in Firebase with Swift使用 Swift 在 Firebase 中通过给定电子邮件获取用户的 uid
【发布时间】:2019-01-21 11:33:39
【问题描述】:

我必须通过提供用户的电子邮件来获取用户的 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)
        })
    }

【问题讨论】:

  • 您在此处发布的代码有什么问题?
  • 对不起,我忘了添加功能。此函数查询电子邮件,但电子邮件在 uid 下。因此,在不知道 uid 是什么的情况下,我无法真正检查电子邮件。

标签: swift firebase firebase-realtime-database swift4


【解决方案1】:

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

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

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

例如,在您的情况下: 您在显示的代码中尝试执行的操作没有任何问题。但是为了扩展它添加一个新的节点电子邮件哈希(因为电子邮件不能用作节点/子节点)最好是您的用户节点的兄弟。这个 emailhashs 节点应该存储 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哈希,请参考:How to convert string to MD5 hash using ios swift

Firebase 实时数据库的索引是通过应用数据库规则来完成的。请参考:

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

【讨论】:

  • 我试过这个,但显然我们不能把电子邮件作为键。键不能为 nil、空或包含一些字符,例如“.”。我也尝试替换“。”使用“,”(它有效)但这似乎是一种黑客行为,并不是一种真正干净的方式。
  • 糟糕,我完全忘记了这一点。我们可以使用电子邮件哈希作为键,而不是使用电子邮件作为键。要获取 md5 哈希,您可以参考:stackoverflow.com/questions/32163848/…。我会相应地更新答案。
猜你喜欢
  • 2018-11-28
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
相关资源
最近更新 更多