【问题标题】:Lookup key inside array of object in FirebaseFirebase中对象数组内的查找键
【发布时间】:2016-12-11 10:25:08
【问题描述】:

在我的应用程序中,我需要查找联系信息数据以检查用户是否已存在于我的数据库中的功能。由于用户可能有多个电子邮件地址,我将这些数据存储在一个名为 ContactInfo 的单独类中。

现在我想查询所有对象并检查电子邮件是否包含在ContactInfo 内的 emails 数组中。因此我使用电子邮件作为密钥,这就是它的 URL 编码的原因。但是我想不出正确的查询来实现这一点。


联系人信息

  • -KYd3pbZ7D--yX6B3HY8
    • 电子邮件
      • john%40gmail%2Ecom: true
      • john%40hotmail%2Ecom: true
    • 名字:约翰
    • 姓:Doe
  • -KYdUDoMVOdUmJ4I3jO-
    • 电子邮件
      • jane%40gmail%2Ecom: true
    • 名字:简
    • 姓:Doe

基于我的数据库的顶层看起来像这样

【问题讨论】:

  • 两个快速的事情:1)请不要在问题中发布结构的图像 - 发布实际的文本版本,然后我们可以复制/粘贴到我们的答案中并且它也是可搜索的。 2)您的问题是“数组”,而您的结构中实际上没有 Firebase 数组。这是一件好事(请不要使用数组),但您可能应该更新问题标题。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

使用电子邮件地址作为密钥可能不是您想要做的。

电子邮件地址发生变化并被视为动态数据 - 最佳做法是不要使用动态数据(可能会发生变化的东西)作为键,就好像它确实发生了变化一样,在您的数据库中引用它的任何地方也必须更新。

一种可能性是存储多封电子邮件:

contactInfo
    -KYd3pbZ7D--yX6B3HY8
         firstname: "John"
         lastname: "Doe"
         main_email: "-JYJkjajisaiisd"

然后是所有电子邮件的单独节点。

contact_emails
    -JYJkjajisaiisd
       email : "john@gmail.com"
       uid : "uid_0"
    -YJNlkokaosomdo
       email : "john@hotmail.com",
       uid : "uid_0"
    -Juiaisidiasda
       email : "frank@fmail.com",
       uid : "uid_3"

这种结构是可查询的、可维护的,并且不必担心将特殊字符(电子邮件字符)作为键进行解析/存储。您可以为每个人存储多封电子邮件,您可以通过更新他们的联系信息中的 main_email 节点来更改他们的主电子邮件

要检查电子邮件,请使用此查询

    contactEmailsRef.queryOrdered(byChild:"email")
          .queryEqual(toValue: "john@hotmail.com")
          .observeSingleEvent(of: .value, with: { snapshot in

                print(snapshot)

    })

将导致打印此节点

-YJNlkokaosomdo
     email : "john@hotmail.com",
     uid : "uid_0"

【讨论】:

  • 非常感谢您的好回答。我完全理解您关于使用电子邮件作为密钥的观点。但是我仍然不确定查询会如何检查,例如系统中存在“john@gmail.com”(即遍历所有contactInfo对象)
  • @user1463853 很棒的评论!我原来的答案搞砸了,所以它已经更新以正确回答你的问题。在这种情况下,如果闭包中有一个有效的快照,那么电子邮件就被发现并且已经存在。如果快照为空,则它不存在。
  • 感谢您的出色回答。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 2020-05-01
  • 2020-07-22
  • 2017-12-24
相关资源
最近更新 更多