【问题标题】:Firebase real time database, get values from different locations in one snapshotFirebase 实时数据库,在一张快照中获取不同位置的值
【发布时间】:2018-06-20 12:04:53
【问题描述】:

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

我想知道是否有更好的方法来做到这一点,我错过了?我担心如果任务无序完成,我的排行榜会变得混乱。我可以在一张快照中获得姓名和分数吗?

谢谢!

【问题讨论】:

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

标签: firebase unity3d firebase-realtime-database


【解决方案1】:

你只能加载:

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

看来您要做的是从多个根中获取子节点的子集,这是不可能的。实际上,您似乎正在尝试进行连接,这在 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

【讨论】:

    猜你喜欢
    • 2021-06-07
    • 2019-05-07
    • 2021-03-26
    • 2018-01-21
    • 1970-01-01
    • 2022-01-21
    • 2021-06-10
    • 2020-02-10
    • 1970-01-01
    相关资源
    最近更新 更多