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
相关产品推荐
相关产品推荐

