【问题标题】:How to get child of child value from firebase in android?如何从android中的firebase获取子值的子值?
【发布时间】:2017-09-03 18:31:16
【问题描述】:

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

【问题讨论】:

  • 到目前为止有任何代码可以显示吗?使用可以在任何数据库引用上简单地调用child() 两次

标签: android firebase firebase-realtime-database


【解决方案1】:

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

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

在这个sn-p中:

  • 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

【讨论】:

  • 非常简单明了的解释。继续努力探索 firebase api !!!
  • FVP 再次救援!
  • 很好的解释!在不知道分支子(这里:ZONE_1)的情况下,是否可以直接获取每个区域的 ZNAME 值?
【解决方案2】:

更简单的方法!!

如果您想访问“区域”的所有子节点的值“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() 来访问它的子节点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-15
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多