You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity(C#)中Firebase实时数据库:判断顶级节点存在并增改数据

Unity中Firebase Realtime Database的节点存在性判断与读写操作

针对你的需求——判断顶级节点是否存在,不存在则创建并添加数据,存在则更新子节点值,以下是具体实现方案:

核心实现思路

你之前使用的GetValueAsync()仅用于读取节点数据,不会自动创建节点。Firebase Realtime Database的写操作本身就具备**"不存在则创建,存在则更新/覆盖"**的特性,无需额外提前判断,直接执行写操作即可满足需求;如果需要显式判断节点状态再执行对应逻辑,也可以通过读取快照实现。

具体代码实现

方式一:直接写操作(推荐,一次网络请求完成)

利用Firebase写操作的特性,无需提前判断节点是否存在,直接执行更新或设置操作:

var db = FirebaseDatabase.DefaultInstance;
var targetNodeRef = db.GetReference("asdfghjkl");

// 直接更新指定子节点,节点不存在则自动创建
targetNodeRef.Child("Lance Armstrong").SetValueAsync(32);

如果需要批量操作多个子节点,可使用UpdateChildrenAsync,它会自动创建不存在的路径,且不会覆盖未指定的子节点:

var db = FirebaseDatabase.DefaultInstance;
var updateData = new Dictionary<string, object>
{
    {"asdfghjkl/Lance Armstrong", 32},
    // 可添加更多需要更新的路径
};
db.RootReference.UpdateChildrenAsync(updateData);

方式二:显式判断节点存在性后操作

若需要明确区分"创建节点"和"更新节点"的逻辑,可先读取节点快照判断状态:

var db = FirebaseDatabase.DefaultInstance;
var targetNodeRef = db.GetReference("asdfghjkl");

targetNodeRef.GetValueAsync().ContinueWith(task =>
{
    if (task.IsFaulted)
    {
        Debug.LogError("读取节点失败: " + task.Exception);
        return;
    }

    DataSnapshot snapshot = task.Result;
    if (snapshot.Exists)
    {
        // 节点存在,更新子节点值
        targetNodeRef.Child("Lance Armstrong").SetValueAsync(32);
        Debug.Log("已更新现有节点数据");
    }
    else
    {
        // 节点不存在,创建节点并初始化数据
        var initialData = new Dictionary<string, object>
        {
            {"Lance Armstrong", 32}
        };
        targetNodeRef.SetValueAsync(initialData);
        Debug.Log("已创建新节点并添加数据");
    }
});

关键说明

  • SetValueAsync():若目标节点不存在则创建并设置数据;若节点已存在,会覆盖该节点下的所有数据(针对子节点操作时,仅覆盖对应子节点)。
  • UpdateChildrenAsync():支持多路径同时更新,不存在的路径自动创建,已存在的路径仅更新指定值,不会影响其他未指定的子节点。

内容的提问来源于stack exchange,提问作者TOM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:12:07