Reputation: 67
I'm using Firebase Realtime Database and I get the following error
FATAL EXCEPTION: main
Process: com.example.tobias.run, PID: 17405
com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Long to String
at com.google.android.gms.internal.zzbtg.zzaG(Unknown Source)
at com.google.android.gms.internal.zzbtg.zzb(Unknown Source)
at com.google.android.gms.internal.zzbtg.zza(Unknown Source)
at com.google.android.gms.internal.zzbtg.zzb(Unknown Source)
at com.google.android.gms.internal.zzbtg$zza.zze(Unknown Source)
at com.google.android.gms.internal.zzbtg$zza.zzaH(Unknown Source)
at com.google.android.gms.internal.zzbtg.zze(Unknown Source)
at com.google.android.gms.internal.zzbtg.zzb(Unknown Source)
at com.google.android.gms.internal.zzbtg.zza(Unknown Source)
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
at com.example.tobias.run.history.HistoryFragment$2.onChildAdded(HistoryFragment.java:123)
at com.google.android.gms.internal.zzbox.zza(Unknown Source)
at com.google.android.gms.internal.zzbqx.zzZV(Unknown Source)
at com.google.android.gms.internal.zzbra$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:241)
at android.app.ActivityThread.main(ActivityThread.java:6274)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
When trying to marshall into a class the data I retrieved from the database. The error occurs here
databaseRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
dataSnapshot.getValue(TrackedRun.class);
}
Tracked run class
public class TrackedRun implements Parcelable {
private float mDistance;
private long mTime;
private long mDate;
private int mRating;
private String mUnit;
private Integer mID = null;
public TrackedRun(int id, long date, float distance, long time, int rating, String unit){
this.mDistance = distance;
this.mTime = time;
this.mDate = date;
this.mRating = rating;
this.mUnit = unit;
this.mID = id;
}
public TrackedRun(){
// Default constructor required for firebase calls to DataSnapshot.getValue(User.class)
}
public TrackedRun(Parcel in) {
this.mID = in.readInt();
this.mDate = in.readLong();
this.mDistance = in.readFloat();
this.mTime = in.readLong();
this.mRating = in.readInt();
this.mUnit = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(mID);
parcel.writeLong(mDate);
parcel.writeFloat(mDistance);
parcel.writeLong(mTime);
parcel.writeInt(mRating);
parcel.writeString(mUnit);
}
@Exclude
public static final Parcelable.Creator<TrackedRun> CREATOR = new Parcelable.Creator<TrackedRun>(){
@Override
public TrackedRun createFromParcel(Parcel parcel) {
return new TrackedRun(parcel);
}
@Override
public TrackedRun[] newArray(int i) {
return new TrackedRun[i];
}
};
public float getDistance(){
return mDistance;
}
public long getTime(){
return mTime;
}
public long getDate(){ return mDate; }
public int getRating(){
return mRating;
}
public String getUnit(){
return mUnit;
}
public Integer getId(){ return mID; }
public void setDistance(String distance){
mDistance = DateManager.distanceToFloat(distance);
}
public void setTime(String time){
mTime = DateManager.timeToUnix(time);
}
public void setDate(String date){
mDate = DateManager.dateToUnix(date);
}
public void setRating(String rating){
mRating = Integer.valueOf(rating);
}
public void setUnit(String unit){
mUnit = unit;
}
I've tried changing the two long fields I have to int, but I got the exact same error. Is it something to do with the fact that I'm implementing Parcelable? Also when I run dataSnapshot.getValue().toString()
all the fields are there in their correct datatypes.
Upvotes: 0
Views: 1057
Reputation: 597
private String mUnit;
you are defined this variable as string and in Firebase database you asign an integer value .. assign double coated to integer values in Firaebase database
in Firebase datbase
instread of ->
mUnit : 1
make it ->
mUnit :"1"
Upvotes: 0
Reputation: 38299
The parameter types for your setter methods are not consistent with the values in the database. For example:
public void setRating(String rating) {
mRating = Integer.valueOf(rating);
}
This causes Firebase to expect a String value in the DB for rating
. It finds a Long value and reports that it cannot convert the Long to the String needed by setRating()
. The same problem exists for setDistance()
, setTime()
and setDate()
.
Change the parameter types or database values to be consistent.
Upvotes: 1