为什么Unity中调用Firebase查询会出现返回结果不一致的问题?
问题根因分析
你当前遇到的会话级查询异常,核心问题出在初始化流程的合法性校验缺失,以及异步任务的错误处理遗漏:
- 未校验Firebase依赖修复结果就直接初始化服务:
CheckAndFixDependenciesAsync执行完成后,如果返回状态不是DependencyStatus.Available,Firebase服务虽然能拿到实例,但底层连接处于异常状态,后续所有数据库请求都会静默失败,这刚好对应你“单会话内状态稳定,重启才会变化”的表现。 - 未处理异步任务的异常状态:所有
ContinueWithOnMainThread的回调都直接取Result,如果任务执行出错(权限拒绝、网络异常、服务未就绪),你不会收到任何错误提示,只会拿到空的快照结果。 - 权限校验时序问题:如果你的数据库规则限制了仅登录用户可访问,当前代码初始化Auth后直接发起查询,没有等登录流程完成,未登录状态下的查询会被规则拦截返回空结果。
修复方案
按照以下步骤调整代码即可解决问题:
- 补全依赖状态校验
- 增加所有异步任务的错误捕获逻辑
- 如果需要登录才能访问数据,等登录完成后再发起查询
修正后的参考代码如下:
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
相关产品推荐
相关产品推荐

