我有一个如下所示的数据库:
path1 > uid0 > node
> uid1 > node
> uid2 > node
该节点包含等于
timestamp
的 ServerValue.TIMESTAMP
。
如果我执行以下查询:
FirebaseDatabase.getInstance().getReference().child("path1")
.orderByChild("timestamp").startAfter(pastCutOff).limitToLast(limit);
我得到所有节点
timestamp > pastCutOff
如果我只想检索单个节点,我会这样做:
FirebaseDatabase.getInstance().getReference().child("path1")
.child(uid);
其中
uid
是数据库中已知的 uid。到目前为止一切都很好。
我只想在更新时间戳以减少带宽时才检索单个节点。
FirebaseDatabase.getInstance().getReference().child("path1")
.child(uid).orderByChild("timestamp").startAfter(pastCutOff);
但这不会返回任何结果。 我已经尝试了我能想到的所有组合,只得到我想要的节点。 如果我这样做:
FirebaseDatabase.getInstance().getReference().child("path1")
.child(uid).orderByValue().startAfter(pastCutOff, "timestamp");
然后逻辑就起作用了,但它只返回
long
中的 timestamp
值,而不是整个节点。
有没有一种组合可以只返回我想要的数据,而不必创建持久的
valueEventListener
?
您实际上正在尝试过滤两个值(UID 和时间戳),而这在实时数据库 API 中是不可能的。
常见的解决方法是将两个值组合成一个属性,然后对其进行排序/过滤。所以给每个节点一个额外的属性:
"uid_timestamp": "valueofuid_valueoftimestamp"
然后您可以对其进行排序和过滤:
FirebaseDatabase.getInstance().getReference().child("path1")
.orderByChild("uid_timestamp").startAfter(uid+"_"+pastCutOff);
另请参阅: