Firebase DatabaseException:无法将java.lang.Long类型的值转换为String

com.google.firebase.database.DatabaseException:无法将java.lang.Long类型的值转换为String

是在尝试将数据检索到对象以供使用时遵循文档时遇到的错误。

这是我的对象模型

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

用户的firebase数据:

IMG在这里 最后评论了我得到错误的代码和行。

  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()); ... 

完整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) 

问题是您将属性“mobile_phone”创建为String,而在Firebase上它是Long类型。

更改:

 private String mobile_phone; 

至:

 private Long mobile_phone; 

检查你的getter和class / model是否在firebase数据库中是等于的。

当方法.getValue()检索数据时,如果签名相同则进行比较。

例:
在课堂上我们有一个getLong
在此处输入图像描述

用于在firebase数据库中获取值 在此处输入图像描述

问题

  1. 如果要手动在firebase数据库中添加值,则值将为long数据类型; 例如:

在此处输入图像描述

  1. 如果要通过命令添加值,则值将作为字符串保存在数据库中。

解:

从数据库获取值时,请将值保存为默认数据类型。 然后,当您想重用该值时,使用toString()方法将其更改为字符串。

如果要在不创建任何对象的情况下直接访问数据,可以使用String将数据类型更改为long.class

 `String reward = ds.child("reward").getValue(String.class);` to `long reward = ds.child("reward").getValue(long.class);` 

要么

 public String reward; to public long reward;