tatarusanu1
tatarusanu1

Reputation: 67

Firebase Database Exception failed to convert long to String

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

Firebase database structure

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

Answers (2)

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

Bob Snyder
Bob Snyder

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

Related Questions