如果值已知,如何在firebase数据库中找到密钥?

时间:2017-08-05 22:56:44

标签: java android firebase firebase-realtime-database

我首先要检查哪个节点有当前用户的用户ID。这一步很好。它给出了正确的值。接下来,我想在该节点(1或2)中搜索以查找该节点内的哪个用户ID具有名为“type”的子节点,该子节点具有值“driver”。我想找到type =“driver”的用户标识。

目前的代码是

{{1}}

My database

2 个答案:

答案 0 :(得分:0)

要获取子键,请尝试:

ds1.getKey();

答案 1 :(得分:0)

使用查询查找驱动程序:

DatabaseReference busRef = ds.getRef(); // no need to rebuild this ref, but I'd recommend rename ds to something more meaningful
Query driverQuery = busRef.orderByKey("type").equalTo("driver");
driverQuery.addListenerForSingleValueEvent(new ValueEventListener() {        
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot driverSnapshot : dataSnapshot.getChildren()) {
            System.out.println(driverSnapshot.getKey());
        }
    }
    ...

这样可行,但我建议认真重新考虑您的数据结构。利用您域的数据模型,提出一个允许您使用案例的有效结构。

例如:如果总线只能有一个驱动程序,为什么不将驱动程序确定为每个总线的属性作为顶级集合:

drivers: {
  "1": "mlxMu..."
}

有了它,您可以直接查找驱动程序,而不必查询它们:

Query driverRef = ref.getChild("drivers").getChild(busno);
driverQuery.addListenerForSingleValueEvent(new ValueEventListener() {        
    public void onDataChange(DataSnapshot dataSnapshot) {
        System.out.println(dataSnapshot.getValue(String.class));
    }
    ...

事实上,对于这种数据结构,简单地将drivers列表保存在内存中并避免嵌套侦听器可能非常可行。这极大地提高了代码的可读性/可维护性。