You need to enable JavaScript to run this app. Unity项目调用Firebase实时数据库读取数据始终返回null如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Unity项目调用Firebase实时数据库读取数据始终返回null如何解决

问题原因及修复方案

核心错误:逻辑判断与取值写法错误

你当前的代码存在两处直接导致读不到值的问题:

  1. 条件分支顺序完全错误,else if(DBTask.Exception == null) 分支覆盖了所有无异常的场景,导致真正读取数据的else分支永远不会执行
  2. 取值时遗漏了.Value属性,直接调用snapshot.Child("Level").ToString()返回的是快照对象本身的字符串,而非存储的字段值

修正后的LoadUserData代码如下:

private IEnumerator LoadUserData()
{
    var DBTask = reference.Child("users").Child(user.UserId).GetValueAsync();
    yield return new WaitUntil(predicate: () => DBTask.IsCompleted);

    if(DBTask.Exception != null)
    {
        Debug.LogWarning($"Failed to register task with {DBTask.Exception}");
    }
    else
    {
        DataSnapshot snapshot = DBTask.Result;
        // 先判断对应节点是否存在
        if (snapshot.Exists)
        {
            // 注意字段大小写要和数据库中完全匹配,Firebase字段名大小写敏感
            level = int.Parse(snapshot.Child("Level").Value.ToString());
            exp = int.Parse(snapshot.Child("Exp").Value.ToString());
        }
        else
        {
            // 节点不存在,初始化默认值
            level = 1;
            exp = 0;
            Debug.Log("用户数据不存在,已初始化默认值");
            // 可选:写入默认值到数据库,后续启动即可直接读取
            reference.Child("users").Child(user.UserId).Child("Level").SetValueAsync(level);
            reference.Child("users").Child(user.UserId).Child("Exp").SetValueAsync(exp);
        }
    }
}

其他排查点

  • 确认Firebase Manager初始化完成后再执行读取操作,在Start方法中可以先加空值判断,避免拿到未初始化的user或reference对象
  • 检查Realtime Database的读写规则,默认规则要求登录后才能读写,确认执行读取前已经完成用户登录,user.UserId有有效值
  • 确认数据库路径与字段名完全匹配,根路径下存在users一级节点,对应userId的二级节点下存在Level、Exp字段,大小写和代码完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 20:54:02