You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:00:56