一尘不染

比较textfield.text和firebase字符串swift

swift

我在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中的电子邮件?

(比较时,我确实将’。’转换为’,’)


阅读 208

收藏
2020-07-07

共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")
}
2020-07-07