【问题标题】:Firebase iOS -What is the difference between .queryOrdered().queryEqual(toValue: and child().observeSingleEventFirebase iOS - .queryOrdered().queryEqual(toValue: 和 child().observeSingleEvent 有什么区别
【发布时间】:2018-07-22 22:39:58
【问题描述】:

在 Firebase 中搜索用户名(或任何与此相关的搜索)时,两者之间有什么区别 .queryOrdered().queryEqual(toValue:child().observeSingleEvent(

我从@Frank van Puffelen 那里查看了下面的答案和 cmets

these comments 他说要使用:

reference.child("usernames").child(usernameYourSearchingFor).observeSingleEvent(of: .value, with: { (snapshot) in

    if snapshot.exists() { ... } else { ... }
})

但在this answer,他的回答是:

ref.child("users").queryOrdered(byChild:"username").queryEqual(toValue: usernameYourSearchingFor).observeSingleEvent(of: .value, with: { snapshot in

    if snapshot.exists() { ... } else { ... }
})

在使用这两种方法中的任何一种搜索数据库时,速度和效率之间是否存在差异,或者只是使用两种不同的方法来实现相同的确切目标?

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    基本上,这些操作适用于两种不同的数据结构。

    在第一个中,您将拥有类似于以下的数据结构:

    {
      "usernames": {
        "usernameYourSearchingFor": {
          // some data
        },
        "otherUsername": {
          // different data
        }
      }
    }
    

    如您所见,您要搜索的用户名是“用户名”节点下的一个键。您可以通过调用child() 函数直接访问它。 (然后附加一个事件观察器)


    现在在第二个结构中:

    {
      "users": {
        "user1": {
          "username": "usernameYourSearchingFor",
          "email": "user1@email.com"
        },
        "user2": {
          "username": "otherUsername",
          "email": "user2@email.com"
        }
      }
    }
    

    用户名实际上是属于用户对象的一个​​属性。您无法直接访问它,因此您需要query“用户”节点才能找到您要搜索的用户名,因此需要.queryOrdered(byChild:"username").queryEqual(toValue: usernameYourSearchingFor)

    【讨论】:

    • @LanceSamaria 在这个答案中澄清一件事;通常,用户正在登录,您需要检索有关该用户的数据;例如,他们的用户名、电子邮件和最喜欢的食物。在这些情况下,您可以通过 Auth 变量了解用户 uid,并且实际上可以直接访问他们的数据,例如 users/their_uid/usernameusers/their_uid/最喜欢的食物。在用户可能有追随者的博客示例中也是如此 - 您将知道他们的追随者 uid,并且可以直接访问他们的用户名。底线是当您可以直接访问数据时不要查询,查询“更重”
    • @Jay 感谢您提供的信息。我的查询问题更多与下载我的应用程序、不登录然后搜索用户名的用户有关。这些用户没有经过身份验证,但他们仍然需要访问数据库。我正在设置服务器令牌以授予他们临时身份验证访问权限以进行搜索,直到他们登录但我仍然想知道有什么区别,因为我已经阅读了很多 SO 帖子并且大多数人都回答了第二个我在搜索用户名时发布的方式而不是第一种方式。
    • @LanceSamaria 在您的用例中,使用选项 2... 选项 1 有效,但通常最好的做法是将节点键与其包含的数据分离。用户名和电子邮件地址等内容可能会发生变化,如果发生这种情况,需要大量工作来遍历数据库中的所有节点并读取密钥和子节点、更新密钥、重新编写密钥。更改子节点要容易得多。
    • @Jay 好点。第二种方式的问题是用户直接访问其他用户的个人节点来搜索用户名。这些不应该只是实际所有者的隐私吗?另外,由于您现在搜索更深几个级别,因此搜索不会花费更长的时间吗?
    • @Jay 感谢您的帮助。与任何与编程有关的事情一样,似乎有多种方法可以实现对用户名的搜索。我仍在构建我的应用程序,我已经能够成功地搜索两种方式,但它又处于测试模式。我会做一些 SO 搜索,然后发布一个关于在运行搜索时平衡安全性与速度的最有效方法的问题。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多