Android - Firebase数据库子节点

时间:2018-01-31 09:35:21

标签: java android firebase firebase-realtime-database

我有这样的Firebase数据库结构:

the firebase database structure

现在我想访问节点中的项目" comingSoonPages"到模型类。如何在该节点中获取对这些不同用户指定项的引用?

数据库参考:

    <address>20</address>
    <startat>0</startat>
    <size>8</size>

    <address>21</address>
    <startat>0</startat>
    <size>8</size>  

现在引用的监听器如下:

mUpcomingDatabaseReference = mFirebaseDatabase.getReference().child("comingSoonPages").child("blrKoramangala")

当我尝试在每个节点中记录名称时,我得到NPE并且值为null。

我映射的模型类是:

mValueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot snapShot : dataSnapshot.getChildren()){
            Log.e("snap" , String.valueOf(snapShot));
            try{
                UpcomingProperty property = snapShot.getValue(UpcomingProperty.class);
                Log.e("name" , String.valueOf(property.getName()));
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
};
mUpcomingDatabaseReference.addValueEventListener(mValueEventListener);

感谢。

扩展的firebase节点: extended node values

2 个答案:

答案 0 :(得分:0)

假设comingSoonPages包含项目列表,如果要访问该项目的所有子节点,则需要在comingSoonPages引用上添加ChildEventListener

DatabaseReference upcomingItemsRef = mFirebaseDatabase.getReference().child("comingSoonPages");

ChildEventListener childEventListener = new ChildEventListener() {
     @Override
     public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
         if(dataSnapshot.exists()) {
             // Handle each individual node like blrKoramangala, cyberHub here.
             String key = dataSnapshot.getKey();
             // Get the UpcomingProperty object here.
             UpcomingProperty property = dataSnapshot.getValue(UpcomingProperty.class);
             Log.d(TAG, "property.getName():" + property.getName();
         }
     }
     // Other methods of ChildEventListener go here
};
upcomingItemsRef.addChildEventListener(childEventListener);

您可以阅读有关使用数据列表here的更多信息。

但是,如果那不是一个列表,那么这就是你做错了:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    // Don't do this. It will get the children of blrKoramangala and
    // those won't be of UpcomingProperty type. 
    // Remove and replace with dataSnapshot.exists()
    for (DataSnapshot snapShot : dataSnapshot.getChildren()){
    ...
    }
}

答案 1 :(得分:0)

要获取该数据,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference comingSoonPagesRef = rootRef.child("comingSoonPages");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String name = ds.child("name").getValue(String.class);
            Log.d("TAG", name);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
comingSoonPagesRef.addListenerForSingleValueEvent(eventListener);

out将是唯一的名字。但你也可以用同样的方式获得所有其他价值。

如果您想使用模型类,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference comingSoonPagesRef = rootRef.child("comingSoonPages");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            UpcomingProperty upcomingProperty = ds.getValue(UpcomingProperty.class);
            Log.d("TAG", upcomingProperty.getName());
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
comingSoonPagesRef.addListenerForSingleValueEvent(eventListener);

您将拥有相同的输出。