Firebase实时数据库,在一个快照中从不同位置获取值

Firebase实时数据库,在一个快照中从不同位置获取值,firebase,unity3d,firebase-realtime-database,Firebase,Unity3d,Firebase Realtime Database,我正在Unity项目中使用Firebase数据库。我读到你想把你的数据库结构尽可能的扁平化,以便更好的表现,所以对于排行榜,我是这样构造的 users uid name uid name leaderboard uid score uid score 我想要一个类,它可以获取这些数据并在完成时触发回调。我在构造函数中运行这个 root.Child("leaderboard").Order

我正在Unity项目中使用Firebase数据库。我读到你想把你的数据库结构尽可能的扁平化,以便更好的表现,所以对于排行榜,我是这样构造的

users
     uid
         name
     uid
         name
leaderboard
     uid
        score
     uid
        score
我想要一个类,它可以获取这些数据并在完成时触发回调。我在构造函数中运行这个

root.Child("leaderboard").OrderByChild("score").LimitToLast(_leaderboardCount).ValueChanged += onValueChanged;
用我写的数据触发回调

void onValueChanged(object sender, ValueChangedEventArgs args)
{
    int index = 0;
    List<string> names = new List<string>();
    foreach (DataSnapshot snapshot in args.Snapshot.Children)
    {
            root.Child("players").Child(snapshot.Key).GetValueAsync().ContinueWith(task =>
            {
                if (task.Result.Exists)
                {
                    names.Add(task.Result.Child("name").Value.ToString());

                    index++;
                    if (index == args.Snapshot.ChildrenCount)
                    {
                        _callback(names);
                    }
                }
            });
        }
    }
void onValueChanged(对象发送方,ValueChangedEventArgs参数)
{
int指数=0;
列表名称=新列表();
foreach(args.snapshot.Children中的DataSnapshot快照)
{
root.Child(“players”).Child(snapshot.Key).GetValueAsync().ContinueWith(任务=>
{
if(task.Result.Exists)
{
name.Add(task.Result.Child(“name”).Value.ToString());
索引++;
if(index==args.Snapshot.ChildrenCount)
{
_(姓名);
}
}
});
}
}
我想知道是否有更好的方法来做这件事,我错过了?我担心如果任务完成的顺序不好,我的排行榜会混乱不堪。我可以在一个快照中获得姓名和分数吗

谢谢

您只能加载:

  • 单个完整节点
  • 在单个节点下匹配特定条件的所有子节点的子集
看起来您试图做的是从多个根中获取子节点的子集,这是不可能的。实际上,看起来您正在尝试进行连接,这在Firebase上是您必须使用客户端代码来完成的

请注意,加载后续节点通常比开发人员预期的效率要高得多,因为Firebase通常可以通过管道传输请求(所有内容都通过单个web套接字连接)。有关详细信息,请参阅。

您只能加载:

  • 单个完整节点
  • 在单个节点下匹配特定条件的所有子节点的子集
看起来您试图做的是从多个根中获取子节点的子集,这是不可能的。实际上,看起来您正在尝试进行连接,这在Firebase上是您必须使用客户端代码来完成的


请注意,加载后续节点通常比开发人员预期的效率要高得多,因为Firebase通常可以通过管道传输请求(所有内容都通过单个web套接字连接)。有关详细信息,请参见。

您还可以复制数据:还可以将姓名与分数一起存储。您还可以复制数据:还可以将姓名与分数一起存储。