Firebase数据库类型转换异常:Boolean转String致应用崩溃排查
问题描述
应用此前运行正常,启动指定Activity时崩溃。
核心代码
private void loadSpins() { reference.child(FirebaseAuth.getInstance().getUid()).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { UserModelTask modelTask = snapshot.getValue(UserModelTask.class); if (snapshot.exists()) { currentSpin = modelTask.getSpins(); binding.currentSp.setText(String.valueOf(currentSpin)); } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); }
崩溃日志
FATAL EXCEPTION: main Process: com.example.cashapp, PID: 1777 com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Boolean to String at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertString(CustomClassMapper.java:426) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:217) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToType(CustomClassMapper.java:179) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.access$100(CustomClassMapper.java:48) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:593) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:563) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:433) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80) at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:202) at com.example.cashapp.SpinnerActivity$3.onDataChange(SpinnerActivity.java:191) at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75) at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7872) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
UserModelTask实体类代码
public class UserModelTask { private int scratch, spins; private String referCode, redeemStatus; public UserModelTask(int spins, String scratch, String referCode, String redeemStatus) { this.spins = spins; this.referCode = referCode; this.redeemStatus = redeemStatus; } public UserModelTask() { } public int getSpins() { return spins; } public void setSpins(int spins) { this.spins = spins; } public String getReferCode() { return referCode; } public String getRedeemStatus() { return redeemStatus; } public void setRedeemStatus(String redeemStatus) { this.redeemStatus = redeemStatus; } public void setReferCode(String referCode) { this.referCode = referCode; } }
已重置数据库,问题仍存在,Firebase数据库中redeemStatus字段值为布尔类型(true)。
问题原因
崩溃日志明确提示无法将布尔类型转换为字符串,核心矛盾点:
UserModelTask类中redeemStatus定义为String类型- Firebase数据库内对应字段实际存储的是布尔值(true)
- Firebase序列化实体类时,尝试将布尔值赋值给String类型变量,触发类型转换异常。
另外注意到UserModelTask的构造函数存在参数错误:构造函数第二个参数是String scratch,但类中scratch是int类型,虽不是当前崩溃的直接原因,但会导致实体类初始化异常,需要同步修复。
修复方案
提供两种适配方案,按需选择:
方案一:修改实体类适配数据库类型
将UserModelTask中的redeemStatus改为布尔类型,同步修复构造函数参数错误,补充缺失的scratch getter/setter:
public class UserModelTask { private int scratch, spins; private String referCode; private boolean redeemStatus; // 修复构造函数参数类型与顺序 public UserModelTask(int spins, int scratch, String referCode, boolean redeemStatus) { this.spins = spins; this.scratch = scratch; this.referCode = referCode; this.redeemStatus = redeemStatus; } public UserModelTask() { } public int getSpins() { return spins; } public void setSpins(int spins) { this.spins = spins; } public String getReferCode() { return referCode; } public void setReferCode(String referCode) { this.referCode = referCode; } // 更新redeemStatus的getter/setter适配布尔类型 public boolean isRedeemStatus() { return redeemStatus; } public void setRedeemStatus(boolean redeemStatus) { this.redeemStatus = redeemStatus; } // 补充scratch的getter/setter public int getScratch() { return scratch; } public void setScratch(int scratch) { this.scratch = scratch; } }
方案二:修改数据库字段类型适配实体类
登录Firebase控制台,将redeemStatus字段的布尔值(true)改为字符串类型(如"true"或"false"),确保与UserModelTask类中的String类型定义一致。
内容的提问来源于stack exchange,提问作者Jakub Olszewski
相关产品推荐
相关产品推荐

