ben
ben

Reputation: 159

Attempt to invoke virtual method on a null object reference .child() Firebase database

Here is how I intend my code to work. I first make sure that a unique placeID VALUE exists in my database (as seen in the picture), and set it to the query object. If the dataSnapshot of that VALUE exists, I want to retrieve the corresponding businessID using

businessID = resInfo_P.getBusinessID();

However it returns a null object reference.

Question: How do I retrieve the businessID VALUE without returning a null?

picture

Code:

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

        }
    });

Model

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

Upvotes: 0

Views: 612

Answers (1)

Frank van Puffelen
Frank van Puffelen

Reputation: 599216

When you execute a query against the Firebase Database, there will potentially be multiple results. So the snapshot contains a list of those results. Even if there is only a single result, the snapshot will contain a list of one result.

You will need to handle this list in your code by iterating over the children of the snapshot:

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

Upvotes: 1

Related Questions