有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android Firebase数据库子节点

我有一个Firebase数据库结构,如下所示:

the firebase database structure

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

数据库参考:

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

现在,引用的侦听器如下所示:

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

当我尝试记录每个节点中的名称时,我得到了NPE,值为null

我正在映射的模型类是:

public class UpcomingProperty implements Serializable {

    //private Amenities amenities;
    private List<String> amenities;
    private Coordinates coordinates;
    private Image image;
    private String link;
    private String location;
    private String name;
    private Text text;
    private List<String> sortParameter;
    private EarlyBird earlyBird;

    public UpcomingProperty(){}

    public List<String> getAmenities() {
        return amenities;
    }

    public void setAmenities(List<String> amenities) {
        this.amenities = amenities;
    }

    public Coordinates getCoordinates() {
        return coordinates;
    }

    public void setCoordinates(Coordinates coordinates) {
        this.coordinates = coordinates;
    }

    public Image getImage() {
        return image;
    }

    public void setImage(Image image) {
        this.image = image;
    }

    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Text getText() {
        return text;
    }

    public void setText(Text text) {
        this.text = text;
    }

    public List<String> getSortParameter() {
        return sortParameter;
    }

    public void setSortParameter(List<String> sortParameter) {
        this.sortParameter = sortParameter;
    }

    public EarlyBird getEarlyBird() {
        return earlyBird;
    }

    public void setEarlyBird(EarlyBird earlyBird) {
        this.earlyBird = earlyBird;
    }
}

谢谢

扩展firebase节点: extended node values


共 (2) 个答案

  1. # 1 楼答案

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

    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。但是你也可以用同样的方法得到所有其他的值

    如果要使用model类,请使用以下代码:

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

    您将获得相同的输出

  2. # 2 楼答案

    假设comingSoonPages包含一个项列表,如果希望访问该项的所有子节点,则需要在comingSoonPages引用上添加一个^{}

    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()){
        ...
        }
    }