📜  在 firebase unity 中迭代数据 - C# (1)

📅  最后修改于: 2023-12-03 14:50:55.026000             🧑  作者: Mango

在 Firebase Unity 中迭代数据 - C#

Firebase Unity 是一个为 Unity 游戏引擎提供实时数据库、云存储、身份验证等功能的插件。在 Unity 游戏中使用 Firebase Unity 可以让开发者更方便地处理游戏中的数据。本文将介绍在 Firebase Unity 中如何迭代数据并相关代码示例。

在 Firebase Unity 中迭代数据

在 Firebase Unity 中迭代数据可以使用 Firebase 的数据读取工具类 DataSnapshotDataSnapshot 提供了三种方法 ForEachHasChildChildren 用于迭代数据库中的数据。具体操作如下:

  1. 获取 Firebase 引用

    FirebaseApp app = FirebaseApp.DefaultInstance;
    FirebaseDatabase database = FirebaseDatabase.GetInstance(app);
    DatabaseReference reference = database.GetReference("path/to/your/node");
    
  2. 获取 DataSnapshot 并进行迭代

    reference.GetValueAsync().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            // 出错处理
        }
        else if (task.IsCompleted)
        {
            DataSnapshot snapshot = task.Result;
            // 迭代整个结点下的所有子节点
            foreach (DataSnapshot childSnapshot in snapshot.Children)
            {
                Debug.Log(childSnapshot.Key + ": " + childSnapshot.Value.ToString());
            }
        }
    });
    

    代码说明:

    • reference.GetValueAsync():获取当前 Firebase 节点的快照 DataSnapshot
    • ContinueWith:指定后续操作,在异步读取任务完成时被触发,并在主线程中执行。
    • DataSnapshot:Firebase 实时数据库中的数据。
  3. 通过 HasChild 方法判断节点是否存在

    reference.GetValueAsync().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            // 出错处理
        }
        else if (task.IsCompleted)
        {
            DataSnapshot snapshot = task.Result;
            // 判断 name 字段是否存在
            if (snapshot.HasChild("name"))
            {
                Debug.Log("name: " + snapshot.Child("name").Value.ToString());
            }
        }
    });
    

    代码说明:

    • HasChild:判断节点下是否存在某个字段,返回布尔值。
  4. 通过 Children 方法获取一个节点下的所有子节点

    reference.GetValueAsync().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            // 出错处理
        }
        else if (task.IsCompleted)
        {
            DataSnapshot snapshot = task.Result;
            // 获取某个节点下的所有子节点
            foreach (DataSnapshot childSnapshot in snapshot.Children)
            {
                Debug.Log(childSnapshot.Key + ": " + childSnapshot.Value.ToString());
            }
        }
    });
    

    代码说明:

    • Children:获取节点下的所有子节点,返回一个可枚举的 IEnumerable
示例代码

完整代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Firebase;
using Firebase.Database;
using Firebase.Unity.Editor;

public class FirebaseExample : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        FirebaseApp app = FirebaseApp.DefaultInstance;
        FirebaseDatabase database = FirebaseDatabase.GetInstance(app);
        DatabaseReference reference = database.GetReference("path/to/your/node");

        reference.GetValueAsync().ContinueWith(task =>
        {
            if (task.IsFaulted)
            {
                Debug.LogError("Task is faulted.");
            }
            else if (task.IsCompleted)
            {
                DataSnapshot snapshot = task.Result;

                // 迭代整个结点下的所有子节点
                foreach (DataSnapshot childSnapshot in snapshot.Children)
                {
                    Debug.Log(childSnapshot.Key + ": " + childSnapshot.Value.ToString());
                }

                // 判断 name 字段是否存在
                if (snapshot.HasChild("name"))
                {
                    Debug.Log("name: " + snapshot.Child("name").Value.ToString());
                }

                // 获取某个节点下的所有子节点
                foreach (DataSnapshot childSnapshot in snapshot.Children)
                {
                    Debug.Log(childSnapshot.Key + ": " + childSnapshot.Value.ToString());
                }
            }
        });
    }
}

代码解释:

  • FirebaseEditorExtensions.Update():初始化 Firebase Unity。必须在 UnityEditor 中调用。
  • FirebaseApp.DefaultInstance:获取 Firebase 实例。
  • FirebaseDatabase.GetInstance(app):获取数据库实例。
  • database.GetReference("path/to/your/node"):获取实例化 DatabaseReference。
总结

Firebase Unity 提供了强大的数据存储和实时同步功能,能够给游戏开发者带来很多便利。了解 Firebase Unity 数据库的数据迭代方法可以让开发者在项目中更灵活地处理数据,更加高效地开发游戏。