根据子数据前面的6位搜索firebase实时数据库,我想查询两个数字(日期)之间的数据
Posted
技术标签:
【中文标题】根据子数据前面的6位搜索firebase实时数据库,我想查询两个数字(日期)之间的数据【英文标题】:Search firebase realtime database base on 6 digit in front of the child data, i want to query data between two numbers (dates) 【发布时间】:2022-01-01 17:24:43 【问题描述】:是否可以从实时数据库中搜索前 6 位数字的数据库,例如我搜索 211010,范围内/前面有 211010 的数据会显示为 211010XXXXXXX、211010XXXXXXX,我想查询数据在两个数字(日期)之间。
211010 是日期 2021-10-10
【问题讨论】:
【参考方案1】:您可能很想使用如下所示的查询:
DatabaseReference db = FirebaseDatabase.getInstance().getReference();
DatabaseReference pendingRef = db.child("Pending");
Query queryByKey = pendingRef.orderByKey().startAt("211010");
但这不会提供预期的结果。为什么?由于@FrankvanPuffelen 在以下答案中提供的原因:
Firebase OrderByKey with startAt and endAt giving wrong results因此,要解决此问题,您拥有的最佳选择是不仅对键使用数值。所以一个简单的解决方案是在键前面加上一个常量字符串。所以对应的查询应该是这样的:
Query queryByKey = pendingRef.orderByKey().startAt("*211010").endAt("*211010" + "\uf8ff");
// ? ?
数据库中的键应该是这样的:
Firebase-root
|
--- *211010...
|
--- *211010...
|
--- *211010...
编辑:
我只是举了下面的例子:
"Pending" :
"2110101" :
"name" : 1
,
"2110102" :
"name" : 2
,
"2110103" :
"name" : 3
,
"2110114" : //It's 21-10-11 and not //It's 21-10-10
"name" : 4
,
使用以下查询(号码前未添加*
):
Query queryByKey = pendingRef.orderByKey().startAt("211010").endAt("211010" + "\uf8ff");
我得到以下结果:
name: 1
name: 2
name: 3
name: 4
所以我得到了所有的结果。但是,当我使用时:
"Pending" :
"*2110101" :
"name" : 1
,
"*2110102" :
"name" : 2
,
"*2110103" :
"name" : 3
,
"*2110114" : //It's 21-10-11 and not //It's 21-10-10
"name" : 4
,
以及以下查询(之前添加了*
):
Query queryByKey = pendingRef.orderByKey().startAt("*211010").endAt("*211010" + "\uf8ff");
我只得到:
name: 1
name: 2
name: 3
所以它也适用于这种情况。
【讨论】:
所以我需要在要保存的数据前面放一个符号?如果我搜索 211010 和接下来的 3 天(如 211013)会怎样 是的,没错。我选择使用*
,但你可以选择任何你想要的,只要它不是数字。试一试,告诉我它是否有效。
okok 让我试试看它是否有效:)
好的,期待看到您的反馈。
嘿@AlexMamo。像往常一样的好答案?---考虑到键的大小,我怀疑SDK会在这种情况下强制转换为数组。只有当键/查询结果开始接近0
时才会出现这个问题,这似乎不会在这里发生。以上是关于根据子数据前面的6位搜索firebase实时数据库,我想查询两个数字(日期)之间的数据的主要内容,如果未能解决你的问题,请参考以下文章