【问题标题】: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 等效的子句,但使用第二种方法,我们模拟了完全相同的行为。