OrderByChild 不会订购,Firebase 实时数据库

Dro*_*ror 1 c# unity-game-engine firebase firebase-realtime-database

我使用 Firebase 实时数据库。我在数据库中有以下排行榜数据:

Leaders:
        0
           Name: Michal
           Score: 40
        1
           Name: David
           Score: 35
        2
           Name: Rob
           Score: 53
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我正在阅读除了OrderByChild不会排序之外还可以正常工作的数据。我认为这与我使用数组编号保存有关。

注意:我不使用任何奇怪的方法来使用数组保存数据,但实际上使用 Unity 交易的谷歌示例,话虽如此,我希望它能OrderByChild工作。交易,见屏幕底部

这是检索数据的代码:

  FirebaseDatabase.DefaultInstance
          .GetReference("Leaders").OrderByChild("score").GetValueAsync().ContinueWith(task =>
                    {
                        if (task.IsFaulted)
                        {
                            Debug.LogError("error in reading LeaderBoard from DB");
                            return;
                        }
                        else if (task.IsCompleted)
                        {
                            Debug.Log("Received values for Leaders.");
                            string JsonLeaderBaord = task.Result.GetRawJsonValue();
                            callback(JsonLeaderBaord);
                        }
                    } 
Run Code Online (Sandbox Code Playgroud)

我确实尝试添加onIndex规则,但还是一样,它忽略了排序。

Fra*_*len 6

当您像这样查询数据库时:

FirebaseDatabase.DefaultInstance
      .GetReference("Leaders").OrderByChild("score").GetValueAsync().ContinueWith(task =>
Run Code Online (Sandbox Code Playgroud)

Firebase 以正确的顺序返回包含请求信息的快照。但是当你打电话时:

string JsonLeaderBaord = task.Result.GetRawJsonValue();
Run Code Online (Sandbox Code Playgroud)

它必须将快照转换为 JSON 数据。在 JSON 中,子节点的顺序根据定义是未定义的,因此您会丢失有关顺序的信息。

要以正确的顺序处理排行榜,请使用内置方法循环快照:

foreach (DataSnapshot leader in snapshot.Children) {
    Debug.Log("Received value for leader: "+leader.Child("Score").Value);
}
Run Code Online (Sandbox Code Playgroud)