如何从android中的firebase获取子值的子项?

时间:2017-04-08 12:11:54

标签: android firebase firebase-realtime-database

如何获取ZNAME值?最初我需要比较密钥(Ex :: Here ZONE_1)然后ZNAME需要得到。提前谢谢......

2 个答案:

答案 0 :(得分:24)

要访问数据库中的值,请为该位置创建DatabaseReference。以下是对数据库中位置的三个引用:

DatabaseReference zonesRef = FirebaseDatabase.getInstance().getReference("ZONES");
DatabaseReference zone1Ref = zonesRef.child("ZONE_1");
DatabaseReference zone1NameRef = zone1Ref.child("ZNAME");

在此片段中:

  • zonesRef指向/ZONES
  • zone1Ref指向/ZONES/ZONE_1
  • zone1NameRef指向/ZONES/ZONE_1/ZNAME

有关详细信息,请参阅Firebase documentation on getting a database reference

您可以将侦听器附加到每个引用,以获取该位置的值。例如,要获取/ZONES/ZONE_1/ZNAME

的值
zone1NameRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Log.i(TAG, dataSnapshot.getValue(String.class);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "onCancelled", databaseError.toException());
    }
});

有关此类读取操作的更多信息,请参阅Firebase documentation on reading values

如果您改为倾听/ZONES/ZONE_1,您将获得整个节点的DataSnapshot及其所有属性。然后,您可以使用DataSnapshot.child()从中获取ZNAME

zone1Ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Log.i(TAG, dataSnapshot.child("ZNAME").getValue(String.class);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "onCancelled", databaseError.toException());
    }
});

再提高一级,您可以在/ZONES上收听,这将为您提供所有区域的快照。由于这会处理多个子项,因此您需要使用DataSnapshot.getChildren()

循环遍历它们
zonesRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot zoneSnapshot: dataSnapshot.getChildren()) {
            Log.i(TAG, zoneSnapshot.child("ZNAME").getValue(String.class);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "onCancelled", databaseError.toException());
    }
});

有关详情,请参阅Firebase documentation on listening for lists of data

最后,您可能想要查询以查找特定区域,例如查找包含"ZCODE": "ECOR"的区域:

Query zonesQuery = zonesRef.orderByChild("ZCODE").equalTo("ECOR");
zonesQuery.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot zoneSnapshot: dataSnapshot.getChildren()) {
            Log.i(TAG, zoneSnapshot.child("ZNAME").getValue(String.class);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "onCancelled", databaseError.toException());
    }
});

要了解有关详情,请阅读Firebase documentation on sorting and filtering data

答案 1 :(得分:0)

更简便的方法!

如果要访问“区域”的所有子节点的值“ Z_Name”,则可以使用以下代码进行访问。

    final DatabaseReference reference= FirebaseDatabase.getInstance().getReference("Zones");
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for (DataSnapshot snapshot : dataSnapshot.getChildren()){

                    String z_name=snapshot.child("Z_name").getValue().toString();
    
            }

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

` 所需的值存储在(上面的代码中已经存在此行):

String z_name=snapshot.child("Z_name").getValue().toString();

此变量“ z_name” 在for循环的第一次迭代中分别具有Zone_1的值,在for循环的第二次迭代中具有Zone_2的值。

其他:如果还有其他节点,我们可以再次使用datasnapshot.getChildren()来访问其子节点