我在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控制台上,显示“用户”和“ 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中的电子邮件?
(比较时,我确实将’。’转换为’,’)
请不要使用电子邮件地址作为密钥。电子邮件地址是动态的,并且可能会更改(就像用户要更改它一样),如果这样做,您将一团糟,因为直接使用该电子邮件的每个节点都将被删除并重新创建。
最佳实践是将密钥与它们包含的数据解除关联。
这是要使用的结构
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") }