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