如何使用 DataSnapshot 和 Firebase for Unity?

Posted

技术标签:

【中文标题】如何使用 DataSnapshot 和 Firebase for Unity?【英文标题】:How to use DataSnapshot with Firebase for Unity? 【发布时间】:2018-08-15 03:17:36 【问题描述】:

谁能解释为什么这段代码永远不会成为 Debug.Log("END");打电话?

我正在尝试弄清楚如何在 Unity 中使用 DataSnapshot for Firebase,但在使用数据快照时,文档几乎毫无价值。我能够获取快照,但使用它过于复杂。

我想对数据库进行一次调用并获取参考“级别”下所有事物的快照

数据库规则如下:

"rules": 
    "levels" : 
       "levelNumber" : 
             "oneStarTime" : 0,
             "twoStarTime" : 30,
             "threeStarTime" : 45
                       
               ,
     "users" : .....

这是我的方法:

void GetLevelSnapshot()
    
        FirebaseDatabase.DefaultInstance.GetReference("levels").OrderByChild("levelNumber").GetValueAsync().ContinueWith(task => 
            if (task.IsFaulted) 
            
                // Handle the error...
            
            else if (task.IsCompleted) 
            
                levelSnapshot = task.Result;

                foreach(var childSnapshot in levelSnapshot.Children)
                
                    Debug.Log("BEGIN");
                    //Debug.Log(childSnapshot.Key);
                    LevelList.Add(childSnapshot.Key);
                    Debug.Log("END");
                

            
        );
    

最后,我正在寻找一种方法来在指定级别上迭代快照并拉出所有子级。但是,在这一点上,我无法让 childSnapshot.Value 给我任何可读的东西。

非常感谢您对此事的任何帮助!

【问题讨论】:

你收到childsnapshot.key了吗? 是的,上面注释掉的Debug.Log实际上打印了正确的第一个值,然后就挂了。 levels 下还有其他直系子女吗? Levels 有 1 和 2 作为子级 删除OrderByChild("levelNumber")并尝试一下 【参考方案1】:

按照以下步骤操作:

User类:


public class User

    public string name;
    public string[] items;
    public string email;

    public string ToString()
    
        return name + ", " + email + ", " + items.ToString();
    


从 Firebase 实时数据库读取数据:

FirebaseDatabase.DefaultInstance.RootReference.Child("users").Child("FIREBASE_UID_HERE").GetValueAsync().ContinueWith(t =>

    if (t.IsCanceled)
    
        Debug.Log("FirebaseDatabaseError: IsCanceled: " + t.Exception);
        return;
    

    if(t.IsFaulted)
    
        Debug.Log("FirebaseDatabaseError: IsFaulted:" + t.Exception);
        return;
    

    DataSnapshot snapshot = t.Result;
    User user = JsonUtility.FromJson<User>(snapshot.GetRawJsonValue());
    Debug.Log(user.ToString());

);

【讨论】:

【参考方案2】:
    void GetLevelSnapshot()

  FirebaseDatabase.DefaultInstance.GetReference("levels").GetValueAsync().ContinueWith(task => 
        if (task.IsFaulted) 
        
            // Handle the error...
        
        else if (task.IsCompleted) 
        
            DataSnapshot levelSnapshot = task.Result;

            foreach(var rules in levelSnapshot.Children) // rules
            
                  Debug.LogFormat("Key = 0", rules.Key);  // "Key = rules"
               foreach(var levels in rules.Children)         //levels
                
                    Debug.LogFormat("Key = 0", levels.Key); //"Key = levelNumber"
                   foreach(var levelNumber in levels.Child) // levelNumber
                     
                     //Debug.Log("BEGIN");
                     Debug.LogFormat("Key = 0, Value = 0", levelNumber.Key, levelNumber.Value.ToString()); //"oneStarTime" : 0,"twoStarTime" : 30,"threeStarTime" : 45
                     //Debug.Log("END");
                      // levelNumbers
                  // levels
             //rules
        
    );

如果您需要更多解释,我希望这会有所帮助,请随时发表评论。我实际上没有时间对其进行测试,但我最近一直在广泛使用 unity3d 和 firebase。我还删除了 OrderByChild() 似乎您想要获取级别以便不确定这是否会影响输出,因此您可以尝试使用或不使用它。请让我知道它是否有效。

【讨论】:

以上是关于如何使用 DataSnapshot 和 Firebase for Unity?的主要内容,如果未能解决你的问题,请参考以下文章

如何作为方法的结果返回 DataSnapshot 值?

如何作为方法的结果返回 DataSnapshot 值?

如何作为方法的结果返回 DataSnapshot 值?

Firebase dataSnapshot 如何访问值

如何在 Android Studio 的 datasnapshot/recyclerview 中创建条件?

DataSnapshot 无法转换为适配器 [关闭]