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

Java 如果值已知,如何在firebase数据库中查找密钥?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我首先要检查哪个节点具有当前用户的userid。这一步很好。它给出了正确的值。然后下一步,我想在该节点(1或2)中搜索,以查找该节点中的哪个userid有一个名为“type”的子节点,该子节点的值为“driver”。我想查找具有type=“driver”的用户标识 当前代码为 mDatabaseReference = FirebaseDatabase.getInstance().getReference(); busReference = mDatabaseReference.child("B

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

当前代码为

mDatabaseReference  = FirebaseDatabase.getInstance().getReference();
busReference = mDatabaseReference.child("Busno");
mUser = FirebaseAuth.getInstance().getCurrentUser();
assert mUser != null;
userid = mUser.getUid();


busReference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()){
            usercount = ds.getChildrenCount();
            for(int i = 1; i <= usercount; i++){
                if(ds.hasChild(userid)){
                    busno = ds.getKey();
                    driverReference = mDatabaseReference.child("Busno").child(busno);

                    driverReference.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            for(DataSnapshot ds1 : dataSnapshot.getChildren()) {

                                // I need help in this place.

                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) { }
                    });
                    break;
                }
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) { }
});
mDatabaseReference=FirebaseDatabase.getInstance().getReference();
busReference=mDatabaseReference.child(“Busno”);
mUser=FirebaseAuth.getInstance().getCurrentUser();
断言缪斯无效的
userid=mUser.getUid();
busReference.addListenerForSingleValueEvent(新值EventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot ds:DataSnapshot.getChildren()){
usercount=ds.getChildrenCount();

对于(int i=1;i要获取子密钥,请尝试:

ds1.getKey();

要获取子密钥,请尝试:

ds1.getKey();

使用查询查找驱动程序:

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));
    }
    ...

事实上,使用这种数据结构,将
驱动程序列表保存在内存中并避免嵌套的侦听器可能非常可行。这大大提高了代码的可读性/可维护性。

使用查询来查找驱动程序:

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));
    }
    ...

事实上,使用这种数据结构,将
驱动程序列表保存在内存中并避免嵌套的侦听器可能是非常可行的。这大大提高了代码的可读性/可维护性。

但是我想要一个名为type的子键,该子键的值应该是“driver”而不是“parent”.所以,我只想要驾驶执照userid@AjayReal执行此逻辑,获取ds1类型并检查是否为驱动程序,如果是,则获取密钥,否则不要执行类似操作:String type=ds1.child(“type”).getValue(String.class);if(type.equals(“driver”){//get key}但我想要具有名为type的子项的子项,其值应为“driver”而不是“parent”.所以,我只想要驾驶执照userid@AjayReal执行此逻辑,获取ds1类型并检查是否为驱动程序,如果是,则获取密钥,否则不执行类似操作:String type=ds1.child(“type”).getValue(String.class);if(type.equals(“driver”){//get key}你找到答案了吗?如果没有,我会发布我的。@UmarZaii请发布你的答案你找到答案了吗?如果没有,我会发布我的。@UmarZaii请发布你的答案