Unity项目调用Firebase实时数据库读取数据始终返回null如何解决
问题原因及修复方案
核心错误:逻辑判断与取值写法错误
你当前的代码存在两处直接导致读不到值的问题:
- 条件分支顺序完全错误,
else if(DBTask.Exception == null)分支覆盖了所有无异常的场景,导致真正读取数据的else分支永远不会执行 - 取值时遗漏了
.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
相关产品推荐
相关产品推荐

