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

Firebase Realtime Database在Unity3D中查询结果多出额外元素如何解决

Unity Firebase Realtime Database DataSnapshot返回异常问题说明

问题描述

在Unity3D中调用Firebase Realtime Database接口读取数据时,偶发出现DataSnapshot返回结果异常:查询得到的子项中多出了由数据库最后一条元素拆分出的额外字段。

运行环境

  • Unity3D版本:2019.2.18f1
  • Firebase版本:8.6.1

数据库结构

desks节点的存储数据如下:

"desks": {
    "0" : {
      "deskID" : 0,
      "deskName" : "Sol iç 1"
    },
    "1" : {
      "deskID" : 1,
      "deskName" : "Sol iç 2"
    },
    "2" : {
      "deskID" : 2,
      "deskName" : "Sol iç 3"
    },
    "3" : {
      "deskID" : 3,
      "deskName" : "Sağ iç 1"
    },
    "4" : {
      "deskID" : 4,
      "deskName" : "Sağ iç 2"
    },
    "5" : {
      "deskID" : 5,
      "deskName" : "Sağ iç 3"
    },
    "6" : {
      "deskID" : 6,
      "deskName" : "Sol dış 1"
    },
    "7" : {
      "deskID" : 7,
      "deskName" : "Sol dış 2"
    },
    "8" : {
      "deskID" : 8,
      "deskName" : "Sağ dış 1"
    },
    "9" : {
      "deskID" : 9,
      "deskName" : "Sağ dış 2"
    },
    "10" : {
      "deskID" : 10,
      "deskName" : "Sağ dış 3"
    },
    "11" : {
      "deskID" : 11,
      "deskName" : "Sağ dış 4"
    },
    "12" : {
      "deskID" : 12,
      "deskName" : "Sağ dış 5"
    },
    "13" : {
      "deskID" : 13,
      "deskName" : "Sağ dış 6"
    },
    "9999" : {
      "deskID" : 9999,
      "deskName" : "Personel"
    }
}

相关代码

数据查询代码

FirebaseDatabase.DefaultInstance.GetReference("desks").GetValueAsync().ContinueWithOnMainThread((task) =>
{
    Desks desks = new Desks();
    if (task.IsFaulted)
    {
        Debug.Log("error read desk data");
    }
    else if (task.IsCompleted)
    {
        DataSnapshot snapshot = task.Result;

        Debug.Log(snapshot.ChildrenCount);
        if (snapshot.ChildrenCount > 0)
        {
            foreach (DataSnapshot snapshotChild in snapshot.Children)
            {
                try
                {
                    Desk desk = JsonUtility.FromJson<Desk>(snapshotChild.GetRawJsonValue());
                    Debug.Log(desk.deskName);
                    desks.desks.Add(desk);

                }catch(Exception ex)
                {
                    Debug.Log(snapshotChild.Key);
                    Debug.Log(snapshotChild.Value);
                    Debug.Log(ex.Data);
                    Debug.Log(ex.Message);
                }
            }
        }
    }
});

Desk实体类定义

[Serializable]
public class Desk
{
    public int deskID;
    public string deskName;
}

异常表现

预期desks节点应返回15个子节点,但是偶发返回17个子节点:第16个子节点Key为deskID、值为9999,第17个子节点Key为deskName、值为Personel,正好是原本Key为9999的子节点的两个字段被拆分当成了独立子节点返回。

修复结果

该问题参考Firebase官方维护者Frank van Puffelen的解答后已修复,连续测试30次均能正常获取到正确数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:36:04