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
相关产品推荐
相关产品推荐

