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

时间:2018-06-20 04:01:44

标签: firebase unity3d firebase-realtime-database

我正在在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);
                    }
                }
            });
        }
    }

我想知道是否有更好的方法来做我丢失的事情?我担心如果任务无法正常完成,我的排行榜就会混乱。我可以在一张快照中获得姓名和分数吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您只能加载:

  • 一个完整的节点
  • 在单个节点下匹配特定条件的所有子节点的子集

似乎您要尝试的是从多个根目录获得子节点的子集,这是不可能的。实际上,您似乎正在尝试进行联接,而在Firebase上则需要使用客户端代码。

请注意,加载后继节点通常比开发人员期望的效率要高得多,因为Firebase通常可以通过管道传递请求(所有内容都通过单个Web套接字连接进行)。有关更多信息,请参见http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786