答案 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()
来访问其子节点