Firebase DatabaseException: Failed to convert value of type java.lang.Long to String
com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Long to String
is the error I keep getting when following the docs in attempting to retrieve data to an object for use.
Here is my object model
public class User {
private String tour_director_key;
private String last_name;
private String location_latitude;
private String tour_id;
private String photo;
private String tour_director_name;
private String middle_name;
private String location_longitude;
private String passenger_id;
private long location_updated;
private String tour_director;
private String email;
private String first_name;
private String mobile_phone;
private String td_id;
public User() {
// empty default constructor, necessary for Firebase to be able to deserialize users
}
public String getTour_director_key() {
return tour_director_key;
}
public String getLast_name() {
return last_name;
}
public String getLocation_latitude() {
return location_latitude;
}
public String getTour_id() {
return tour_id;
}
public String getPhoto() {
return photo;
}
public String getTour_director_name() {
return tour_director_name;
}
public String getMiddle_name() {
return middle_name;
}
public String getLocation_longitude() {
return location_longitude;
}
public String getPassenger_id() { return passenger_id; }
public String getMobile_phone() { return mobile_phone; }
public long getLocation_updated() {
return location_updated;
}
public String getTour_director() {
return tour_director;
}
public String getEmail() {
return email;
}
public String getFirst_name() {
return first_name;
}
public String getTd_id() { return td_id; }
}
Data on firebase for user:
and finally the code & line I get the error on is commented.
Query userDataQuery = Constants.USER_REF.orderByKey().equalTo(mUserId);
userDataQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
//// ERROR COMES FROM THE LINE BELOW ////
User currentUser = postSnapshot.getValue(User.class);
Log.i("THE_CURRENT_USER:::", currentUser.toString());
Log.i("THE_USERS_EMAIL:::", currentUser.getEmail());
...
Full Stacktrace:
FATAL EXCEPTION: main
Process: app.timto.co.app, PID: 7453
com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Long to String
at com.google.android.gms.internal.zzaln.zzcc(Unknown Source)
at com.google.android.gms.internal.zzaln.zzb(Unknown Source)
at com.google.android.gms.internal.zzaln.zza(Unknown Source)
at com.google.android.gms.internal.zzaln.zzb(Unknown Source)
at com.google.android.gms.internal.zzaln$zza.zze(Unknown Source)
at com.google.android.gms.internal.zzaln$zza.zzcc(Unknown Source)
at com.google.android.gms.internal.zzaln.zzd(Unknown Source)
at com.google.android.gms.internal.zzaln.zzb(Unknown Source)
at com.google.android.gms.internal.zzaln.zza(Unknown Source)
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
at app.timto.co.app.AttendanceActivity$1$1.onDataChange(AttendanceActivity.java:112)
at com.google.android.gms.internal.zzaie.zza(Unknown Source)
at com.google.android.gms.internal.zzaje.zzcta(Unknown Source)
at com.google.android.gms.internal.zzajh$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
The problem is that you are creating the property "mobile_phone" as a String and on Firebase it is a Long type.
Change:
private String mobile_phone;
To:
private Long mobile_phone;
Problems
- If you are adding values in firebase database manually, the values will be in long data type; for example:
- If you are adding values by commands, the values will be saved in the database as string.
Solution:
When you are getting the values from database, save the values in default data type. Then, when you want to reuse the value change it into the string by using the toString() method.
Check if your getters and class/model are equals in firebase database.
When method .getValue() retrieve datas it compare if signatures are same.
example:
In class we have a getLong
for get value retrieve in firebase database