0

I'm trying to retrieve data from my Firebase Realtime Database but encountering this issue.

I'm suspecting I got this error due to my path in DatabaseReference. I tried different paths but none seemed to work.

Here's my database (The generated texts are userID)

enter image description here

My class that stores the data structure

public class ERDataStructure {
private String temperature;
private String humidity;

public ERDataStructure() {

}
    public ERDataStructure(String temperature, String humidity) {
        this.temperature = temperature;
        this.humidity = humidity;
    }

public String getTemperature(){

    return temperature;
}
public void setTemperature(String temperature){

    this.temperature = temperature;
}

public String getHumidity() {

    return humidity;
}
public void setHumidity(String humidity) {

    this.humidity = humidity;
}
}

My ReadingScreen.java (MainActivity)

import ...


public class ReadingScreen extends AppCompatActivity {

//Firebase Initialization
FirebaseAuth mAuth;
FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;
private FirebaseDatabase mFirebaseDatabase;

private static final String TAG = "ReadingScreen";
ERDataStructure mData;
private TextView textViewTemperatureNumber, textViewHumidityNumber;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reading_screen);
    //Find Views
    textViewHumidityNumber = (TextView) findViewById(R.id.humidity_number);
    textViewTemperatureNumber = (TextView) findViewById(R.id.temperature_number);
    // Initiate Firebase
    mAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    FirebaseUser user = mAuth.getCurrentUser();
    String userID = user.getUid();

     // Non-working Reference, but code works
    //myRef = mFirebaseDatabase.getReference();
    //myRef = mFirebaseDatabase.getReference().child(userID);

     //Crashing Reference
      myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");
    //myRef = mFirebaseDatabase.getReference("ERDataStructure");
    //
    retrieveData();
}
public void gotoMainMenu (View view)
{
    Intent intent = new Intent(ReadingScreen.this, MainMenu.class);
    startActivity(intent);
}
private void retrieveData(){
    myRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
            textViewTemperatureNumber.setText("" +ds.getTemperature());
            textViewHumidityNumber.setText(""+ds.getHumidity());

        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
            textViewTemperatureNumber.setText("" +ds.getTemperature());
            textViewHumidityNumber.setText(""+ds.getHumidity());
        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
    myRef.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            List<ERDataStructure> arraylist = new ArrayList<ERDataStructure>();
            if (dataSnapshot != null && dataSnapshot.getValue() != null){
                //FirebaseUser user = mAuth.getCurrentUser();
                //String userID = user.getUid();
                for (DataSnapshot a : dataSnapshot.getChildren()){

                    ERDataStructure dataStructure = new ERDataStructure();
                    dataStructure.setTemperature(a.getValue(ERDataStructure.class).getTemperature());
                    dataStructure.setHumidity(a.getValue(ERDataStructure.class).getHumidity());
                    arraylist.add(dataStructure);
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}
}

The error was recorded in

ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);

Edit: After adding another level to my database, it manages to run

enter image description here

0

1 Answer 1

1

You need to use ValueEventListener instead of ChildEventListener, so change it to this:

myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");

myRef.addValueEventListener(new ValueEventListener() {
   @Override
public void onDataChange(DataSnapshot dataSnapshot) {
   ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
 }
   @Override
public void onCancelled(DatabaseError databaseError) {
   }
});

In this case you use ValueEventListener, because when you use childEventListener you are basically looping inside this snapshot and returning the value of humidity as type String. It is like looping over dataSnapshot.getChildren() in the valueventlistener.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.