Firebase 实时数据库在 Unity3d 中的结果上添加了额外的元素

Firebase realtime database is adding extra element on result in Unity3d

我正在尝试从数据库获取数据。但问题是 Datasnapshot 结果不正确。结果 children 有一个额外的元素,它是 db 中的最后一个元素。你能说我做错了什么吗?

Unity3D版本:2019.2.18f1 Firebase 版本:8.6.1

数据:

    "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);
                       }
                   }
               }

这是日志数据。如您所见,最后一个元素是“9999”-> deskID = 9999,deskName =“Personel”。但是在日志中,您可以看到最后一个元素 deskID 和 deskName 在结果中显示为快照 child。

log data

编辑:

首先我想多解释一下结果数据有什么问题。 我的结果列表必须是 15 children。但有时结果会得到 17children。第 16 个 child 的键:'deskID' 和值:'9999' 和第 17 个 child 的键:'deskName' 和值:'Personel'.

办公桌class:

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

在 Frank van Puffelen 的回答之后,这个错误就消失了。我尝试了 30 次并从数据库中获取了准确的数据。

您很可能看到的是 Firebase 的数组强制转换的结果。当您检索其键类似于数组索引的数据时,Firebase SDK 和 REST API 会将结果转换为数组。如果数组中的一些键丢失,这些键将填充 null 个值。

为防止这种情况发生,请不要为您的键使用顺序数值。相反,要么使用 Firebase 的本机按键,要么为您的数字键提供一个短字符串前缀以防止数组强制转换,即 key_0key_1

有关详细信息,请参阅 Best Practices: Arrays in Firebase