我在Firebase中有一个具有单独用户节点的数据库。在每个用户的节点中将是与他们有关的数据并且将是私有的。除此之外,我想创建一个只是已注册电子邮件集合的节点。原因是当用户登录VC并且用户键入电子邮件时...如果电子邮件已经注册,则图像视图将变为绿色。但是,如果电子邮件不在数据库中(或者如果它与电子邮件地址格式不匹配),则图像将为红色。
之前关于我之前问题的答案说明我需要更改'。'电子邮件地址中的','。因此@ gmail.com将存储为gmail,com
我知道了。
FIRAuth.auth()?.createUser(withEmail: email, password: password, completion: { (user, error) in
if error == nil {
let email = firstContainerTextField.text ?? ""
let newString = email.replacingOccurrences(of: ".", with: ",", options: .literal, range: nil)
self.ref.child("users").child("allUsers").child(newString).setValue(true)
self.ref.child("users").child((user?.uid)!).setValue(["Email": email])
FIRAuth.auth()!.signIn(withEmail: email,
password: password)
} else {
//registration failure
}
这是来自新用户VC(部分)的代码。
因此,在Firebase控制台
上显示“users”和“allUsers”的节点如下所示users
allUsers
bob@bob,com: true
ted@ted,com: true
“真正的”部分只是因为我可以将bob @ bob,com放到数据库中......真正的部分永远不会用于任何事情。
在VC中登录我老实说无法弄清楚该怎么做
之前的回答说要使用
hasChildren()
然后我用它然后用谷歌搜索该怎么做 我试过用这样的东西
ref.child("users").child("allUsers").queryEqual(toValue: newString)
.observe(.value, with: { snapshot in
if snapshot.hasChildren() {
for child in snapshot.children.allObjects as! [FIRDataSnapshot] {
....
}
});
但我似乎无法随心所欲。
如何查看textfield.text ==已存储在firebase中的电子邮件?
(比较时我确实将'。'转换为',')
答案 0 :(得分:1)
请勿使用电子邮件地址作为密钥。电子邮件地址是动态的,可能会发生变化(如果用户想要更改它们),如果他们这样做,您手上就会弄得一团糟,因为每个直接使用该电子邮件的节点都会被删除并重新创建
最佳做法是将密钥与其中包含的数据取消关联。
这里是使用的结构
emails
-Yiaisjpa90is
email: "dude@test.com"
-Yijs9a9js09a
email: "thing@test.com"
然后您只需在电子邮件节点中查询您要查找的电子邮件,并相应处理(如果存在)。
还有一些代码
emailsRef.queryOrdered(byChild: "email").queryEqual(toValue: "dude@test.com")
.observe(.value, with: { snapshot in
if snapshot.value is NSNull {
print("the snapshot was null, no email found")
} else {
print("email was found, YIPEE")
}
})
为了完整起见,使用
会更加快捷if snapshot.exists() {
print("found it")
} else {
print("no email found")
}