在我的应用程序中,我需要查找联系人信息数据以检查用户是否已经存在于数据库中的功能。因为用户可能有多个电子邮件地址,所以我将这些数据存储在一个名为ContactInfo的单独类中。
现在我想查询所有对象并检查emails中的ContactInfo数组中是否包含电子邮件。因此我使用电子邮件作为密钥,这就是为什么它是URL编码的。但是我无法找到正确的查询来实现这一点。
联系人信息
-KYd3pbZ7D—yX6B3HY8型
电子邮件
john%40gmail%2Ecom:正确
john%40hotmail%2Ecom:真
名字:约翰
姓氏:Doe
-基都多姆沃杜姆J4I3JO-
电子邮件
简%40gmail%2Ecom:true
名字:简
姓氏:Doe
基于此,我的数据库的顶层如下所示
ios - Firebase中对象数组内的查找键-LMLPHP

最佳答案

使用电子邮件地址作为密钥可能不是您想要做的。
电子邮件地址会更改并被视为动态数据-最好不要将动态数据(可能会更改的内容)用作密钥,因为如果它确实更改了,则数据库中引用的任何位置也都必须更新。
一种可能是存储多封电子邮件:

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

然后是所有电子邮件的单独节点。
contact_emails
    -JYJkjajisaiisd
       email : "[email protected]"
       uid : "uid_0"
    -YJNlkokaosomdo
       email : "[email protected]",
       uid : "uid_0"
    -Juiaisidiasda
       email : "[email protected]",
       uid : "uid_3"

这种结构是可查询的、可维护的,并且避免了将特殊字符(电子邮件字符)解析/存储为键的麻烦。您可以为每个人存储多封电子邮件,您可以通过更新联系人信息中的主电子邮件节点来更改他们的主电子邮件
要查看电子邮件,请使用此查询
    contactEmailsRef.queryOrdered(byChild:"email")
          .queryEqual(toValue: "[email protected]")
          .observeSingleEvent(of: .value, with: { snapshot in

                print(snapshot)

    })

将导致打印此节点
-YJNlkokaosomdo
     email : "[email protected]",
     uid : "uid_0"

09-11 18:35