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

Unity中Firebase数据库数据转Int类型报错,求解决方法

Firebase数据库加载Int类型level数据时的InvalidCastException解决方法

问题背景

原有代码可实现将Firebase数据库中的level数据以字符串形式保存/加载到文本控件,但尝试将加载的level数据直接强转为int类型变量时,Unity抛出System.InvalidCastException: Specified cast is not valid.错误。

原有保存/加载代码:

public void saveData()
{
    Reference.Child("users").Child(userId).Child("level").SetValueAsync(levelText.text.ToString());
}

public void loadData()
{
    FirebaseDatabase.DefaultInstance.GetReference("").ValueChanged += Script_ValueChanged;
}

private void Script_ValueChanged(object sender, ValueChangedEventArgs e)
{
    levelText.text = e.Snapshot.Child("users").Child(userId).Child("level").GetValue(true).ToString();
}

出错的转换代码:

private void Script_ValueChanged(object sender, ValueChangedEventArgs e)
{
    level = (int)e.Snapshot.Child("users").Child(userId).Child("level").GetValue(true);
    levelText.text = level.ToString();
}

错误原因

当前saveData方法是将文本控件的内容以字符串类型存入Firebase数据库,而GetValue(true)返回的是字符串对象,直接用(int)强转字符串类型会触发类型转换异常。

解决方法

方法1:字符串转int(兼容现有数据库数据)

如果不想修改数据库中已存的数据格式,先将获取到的字符串解析为int:

private void Script_ValueChanged(object sender, ValueChangedEventArgs e)
{
    string levelStr = e.Snapshot.Child("users").Child(userId).Child("level").GetValue(true).ToString();
    
    // 安全解析:用TryParse避免因格式错误导致崩溃
    if (int.TryParse(levelStr, out int parsedLevel))
    {
        level = parsedLevel;
        levelText.text = level.ToString();
    }
    else
    {
        // 解析失败时的默认处理,比如设为初始等级1
        level = 1;
        levelText.text = "1";
    }
}

方法2:优化保存逻辑,直接存储数字类型(推荐)

修改saveData方法,先将文本内容转为int后再存入数据库,确保数据库中level字段为数字类型:

public void saveData()
{
    if (int.TryParse(levelText.text, out int currentLevel))
    {
        Reference.Child("users").Child(userId).Child("level").SetValueAsync(currentLevel);
    }
}

此时读取数据时,可直接使用Firebase的类型安全获取方法,或转换Firebase默认的long类型为int:

private void Script_ValueChanged(object sender, ValueChangedEventArgs e)
{
    // 方式A:用GetValue<int>()直接获取int类型
    level = e.Snapshot.Child("users").Child(userId).Child("level").GetValue<int>();
    
    // 方式B:Firebase数字默认存储为long,转int
    // level = (int)(long)e.Snapshot.Child("users").Child(userId).Child("level").GetValue(true);
    
    levelText.text = level.ToString();
}

这种方式更适合后续的升级操作(如level++),避免字符串解析的额外开销和错误风险。

内容的提问来源于stack exchange,提问作者Eierpilz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:01:07