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

为什么Unity中调用Firebase查询会出现返回结果不一致的问题?

问题根因分析

你当前遇到的会话级查询异常,核心问题出在初始化流程的合法性校验缺失,以及异步任务的错误处理遗漏:

  1. 未校验Firebase依赖修复结果就直接初始化服务:CheckAndFixDependenciesAsync 执行完成后,如果返回状态不是 DependencyStatus.Available,Firebase服务虽然能拿到实例,但底层连接处于异常状态,后续所有数据库请求都会静默失败,这刚好对应你“单会话内状态稳定,重启才会变化”的表现。
  2. 未处理异步任务的异常状态:所有ContinueWithOnMainThread的回调都直接取Result,如果任务执行出错(权限拒绝、网络异常、服务未就绪),你不会收到任何错误提示,只会拿到空的快照结果。
  3. 权限校验时序问题:如果你的数据库规则限制了仅登录用户可访问,当前代码初始化Auth后直接发起查询,没有等登录流程完成,未登录状态下的查询会被规则拦截返回空结果。

修复方案

按照以下步骤调整代码即可解决问题:

  1. 补全依赖状态校验
  2. 增加所有异步任务的错误捕获逻辑
  3. 如果需要登录才能访问数据,等登录完成后再发起查询

修正后的参考代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Firebase;
using Firebase.Database;
using Firebase.Extensions;
using Firebase.Auth;

public class firebasetest : MonoBehaviour
{
    FirebaseDatabase db;
    DatabaseReference dbReference;
    FirebaseAuth user;

    void Start()
    {
        FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task =>
        {
            // 先校验依赖状态
            if (task.Result != DependencyStatus.Available)
            {
                Debug.LogError($"Firebase依赖修复失败,状态:{task.Result}");
                return;
            }
            
            user = Firebase.Auth.FirebaseAuth.DefaultInstance;
            db = FirebaseDatabase.DefaultInstance;
            dbReference = db.RootReference;

            // 如果需要登录才能访问数据,这里要等登录完成再调用GetStories
            // 示例:匿名登录完成后再查询
            user.SignInAnonymouslyAsync().ContinueWithOnMainThread(loginTask =>
            {
                if (loginTask.IsFaulted || loginTask.IsCanceled)
                {
                    Debug.LogError($"登录失败:{loginTask.Exception}");
                    return;
                }
                GetStories();
            });

            // 如果数据库是公开可读不需要登录,直接调用GetStories即可
            // GetStories();
        });
    }

    public void GetStories()
    {
        db.GetReference("stories").OrderByChild("postDate").LimitToFirst(100).GetValueAsync().ContinueWithOnMainThread(task =>
        {
            // 先校验查询任务是否正常完成
            if (task.IsFaulted || task.IsCanceled)
            {
                Debug.LogError($"查询失败:{task.Exception}");
                return;
            }

            DataSnapshot stories = task.Result;
            if (!stories.Exists)
            {
                Debug.LogWarning("查询到的节点不存在");
                return;
            }

            foreach (var child in stories.Children)
            {
                Debug.Log(child.Child("title").Value);
            }
        });
    }
}

额外排查建议

如果调整后还有问题,可以先确认数据库规则是否允许当前用户访问stories节点,临时把规则改成公开可读测试:

{
  "rules": {
    "stories": {
      ".read": true,
      ".write": false
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:00:03