【问题标题】:what is the different betwen "equalTo" and "startAt & endAt" in firebase and when i should use "equalTo" or "startAt and endAt"?firebase 中的“equalTo”和“startAt & endAt”有什么不同,什么时候应该使用“equalTo”或“startAt 和 endAt”?
【发布时间】:2026-01-03 08:00:02
【问题描述】:

当我尝试通过电子邮件或电话号码查找记录时,我一直在使用以下两个代码,有时第一个代码工作正常,有时不工作,第二个代码也一样。

下面的代码有什么区别,什么时候应该使用 "equalTo""startAt and endAt"

ref.orderByChild("email")
            .equalTo(str)

ref.orderByChild("email")
            .startAt(str)
            .endAt(str+"\\uf8ff")

【问题讨论】:

标签: java android firebase firebase-realtime-database kotlin


【解决方案1】:
ref.orderByChild("email").equalTo(str)

上面的意思是email必须等于str的值。和说WHERE email= 'userx@gmail.com'是一样的


ref.orderByChild("email").startAt(str).endAt(str+"\\uf8ff")

这就像说WHERE email LIKE ca%,它将返回所有以"ca"开头的电子邮件

public Query startAt (String value)

使用给定的 orderBy 指令或默认优先级创建一个查询,限制为仅返回值大于或等于给定值的子节点。

public Query endAt (String value)

使用给定的 orderBy 指令或优先级作为默认值,创建一个限制为仅返回值小于或等于给定值的子节点的查询。

\uf8ff 只是 unicode 中的最后一个字符,因此充当结束保护。

检查这里是否有查询:

https://www.youtube.com/watch?v=sKFLI5FOOHs

【讨论】:

    【解决方案2】:

    确实,在“某些”情况下,您可以使用第一种方法或另一种方法来实现相同的目的,但从有关filtering data 的官方文档中,每种方法都有不同的目的:

    equalTo() - 根据选择的排序方法返回等于指定键或值的项目。

    startAt() - 根据选择的 order-by 方法返回大于或等于指定键或值的项目。

    endAt() - 根据选择的 order-by 方法返回小于或等于指定键或值的项目。

    但作为结论,当您想要完美匹配时,请使用第一种方法。当您想要过滤以某些字符开头的数据时,第二种方法通常用于搜索查询。就 SQL 而言,请注意 Firebase 中没有与 LIKE 等效的子句,但使用第二种方法,我们模拟了完全相同的行为。

    【讨论】: