尝试在空对象引用.child()Firebase数据库上调用虚方法

时间:2017-08-21 13:54:41

标签: android firebase firebase-realtime-database

以下是我打算使用代码的方法。我首先确保我的数据库中存在唯一的placeID VALUE(如图所示),并将其设置为查询对象。如果该VALUE的dataSnapshot存在,我想使用

检索相应的businessID
businessID = resInfo_P.getBusinessID();

但是它返回一个空对象引用。

问题:如何在不返回null的情况下检索businessID VALUE?

picture

代码:

    ref2 = FirebaseDatabase.getInstance().getReference();
    mDatabase = FirebaseDatabase.getInstance().getReference();

    Query query = ref2.child("place_id").orderByChild("placeID").equalTo(resID);
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()){
                RestaurantInformation resInfo_P = dataSnapshot
                                  .child("place_id")
                                  .child(resID).getValue(RestaurantInformation.class);

                businessID = resInfo_P.getBusinessID(); // null object exception


            } else {

                ...
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

模型

public class RestaurantInformation {

    private String resName;
    private String status;
    private String businessID;
    private String placeID;

    public RestaurantInformation() {

    }

    public RestaurantInformation(String businessID, String placeID) {
        this.businessID = businessID;
        this.placeID = placeID;
    }

    public RestaurantInformation(String resName) {
        this.resName = resName;

    }

    public String getResName() {
        return resName;
    }

    public void setResName(String resName) {
        this.resName = resName;
    }

    public String getBusinessID() {
        return businessID;
    }

    public void setBusinessID(String placeID) {
        this.businessID = placeID;
    }

    public String getPlaceID() {
        return placeID;
    }

    public void setPlaceID(String placeID) {
        this.placeID = placeID;
    }
}

1 个答案:

答案 0 :(得分:1)

对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

您需要通过遍历快照的子项来处理代码中的此列表:

Query query = ref2.child("place_id").orderByChild("placeID").equalTo(resID);
query.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    if(dataSnapshot.exists()){
      for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
        RestaurantInformation resInfo_P = childSnapshot.getValue(RestaurantInformation.class);
        businessID = resInfo_P.getBusinessID();
      }
    } else {
            ...
    }