简体   繁体   中英

DatabaseException: can't convert object of java.Lang.String to type

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)

在此处输入图片说明

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

在此处输入图片说明

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 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM