ZootHii
ZootHii

Reputation: 1040

How to read Dictionary from FireBase Database in Unity

enter image description here

public void AddDatabase(User user)
{

    //User user = new User("pç", 2);
    Dictionary<string, object> result = new Dictionary<string, object>();
    result["score"] = user.score;
    result["username"] = user.username;
    reference.Child("datas").Child(user.username).SetValueAsync(result);

}



public void GetDatabase()
{
    FirebaseDatabase.DefaultInstance.GetReference("datas").GetValueAsync().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            // Handle the error...
        }
        else if (task.IsCompleted)
        {
            DataSnapshot snapshot = task.Result;

            ArrayList childs = new ArrayList();
            //Dictionary<string, object> xyz = new Dictionary<string, object>();

            foreach (var item in snapshot.Children)
            {
                childs.Add(item.Value);

                //xyz.Add("dat", item.Value);
            }

            // this does not work I can't see values and keys in the console
            foreach (KeyValuePair<string, object> item in childs)
            {   
                Debug.Log(item.Key);
                Debug.Log(item.Value);
            }
        }
    });
}

I write datas into firebase with AddDatabase and I want to read every Score and Username one by one in order with GetDatabase so I can put them Leaderboard but I can't how can I do that and I already checked firebase database docs. Thank you

Upvotes: 1

Views: 1790

Answers (3)

Patrick Martin
Patrick Martin

Reputation: 3131

Depending on the data returned in GetValueAsync, DataSnapshot may have a Dictionary<string, object> in it already:

public void GetDatabase()
{
    FirebaseDatabase.DefaultInstance.GetReference("datas").GetValueAsync().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            // Handle the error...
        }
        else if (task.IsCompleted)
        {
            DataSnapshot snapshot = task.Result;
            var dictionary = snapshot.Value as Dictionary<string, object>;
            if (dictionary != null) {
                // dictionary stuff here
            }
        }
    });
}

From the docs:

Value returns the data contained in this snapshot as native types. The possible types returned are:

  • bool
  • string
  • long
  • double
  • IDictionary{string, object}
  • List{object} This list is recursive; the possible types for object in the above list is given by the same list. These types correspond to the types available in JSON.

Now a quick note: the Unity SDK does guess at whether the Value should be a List or a Dictionary if it has children. The general rule is: It's a List if the elements are sequential and roughly 50% of the keys in the range are filled (ex: 0="hi", 1="I'm", 3="a", 4="list" is a list even though it's missing 2). Otherwise it will try to make a Dictionary. If you are dealing with integer keys, you may want to have mirrored logic for dealing with a List or Dictionary just to be safe.

Upvotes: 1

abo
abo

Reputation: 146

Try to follow the two examples:

Upvotes: 0

Paramecium13
Paramecium13

Reputation: 345

What is the type of snapshot.Children and what is the type of its contents? If the contents is not of type KeyValuePair<string, object> then the second foreach loop won't work properly (I am not familiar enough with non-generic collections to say what would actually happen).

I strongly recommend using types from the System.Collections.Generic namespace, such as List<T>, rather than non-generic collections like ArrayList. This will make it easier to see what your code is doing. In addition to being easier to work with, they also have better performance because they don't require casting.

Upvotes: 0

Related Questions