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

Unity C#能否向Firebase实时数据库发送动态Key键名

问题

当前Firebase数据库结构如下所示:
Firebase Realtime Database结构截图

实现目标

在Unity C#开发场景中,需要让键值对结构里的userID部分可根据变量值动态作为键名使用。

核心疑问

是否可以从Unity C#端向Firebase Realtime Database发送键名为动态值的键值对数据?

现有问题代码

public void CreateUser()
{

    userID = user.UserId; //this is the auth userID

    Username UserIDtoUsername = new Username(registerUsername.text, userID);
    string json = JsonUtility.ToJson(UserIDtoUsername);
    dbReference.Child("usernames").SetRawJsonValueAsync(json);

}

public class Username
{
    public string username;
    public string userID;

    public Username(string username, string userID)
    {
        userID = username; //this does not work because we are not passing back the variables
        //need a way to pass back the user's current userID and username to then convert to Json and into Firebase
    }

}

当前代码存在逻辑问题,无法正确传递动态userID作为键名,需要找到可行方案,将携带动态键名的键值对转换为Json格式后写入Firebase数据库。


解答

完全可以实现,不需要手动拼接JSON字符串,两种成熟方案可选,优先选第一种,出错概率最低。

方案1:动态拼接子节点路径(官方推荐写法)

你要存储的结构本质是usernames/[动态userID]/用户信息,Firebase Realtime Database的路径本身就支持传入动态字符串作为节点名,根本不需要把动态键包在JSON里处理。
首先先修正你原有代码里的两个低级错误:

  • Username类的构造函数赋值写反,且没有用this区分成员变量和入参,导致成员变量根本拿不到正确传入的值
  • 直接对usernames根节点调用SetRawJsonValueAsync会覆盖该节点下所有已存的其他用户数据,不是增量写入

修正后的完整代码:

public void CreateUser()
{
    string userID = user.UserId; // 拿到Firebase Auth生成的唯一用户ID
    Username userInfo = new Username(registerUsername.text, userID);
    string json = JsonUtility.ToJson(userInfo);
    // 把动态userID作为子节点名拼接到路径里,直接写入对应位置
    dbReference.Child("usernames").Child(userID).SetRawJsonValueAsync(json);
}

public class Username
{
    public string username;
    public string userID;

    public Username(string username, string userID)
    {
        // 给当前类的成员变量赋值,用this区分同名入参
        this.username = username;
        this.userID = userID;
    }
}

方案2:用字典构造动态键值对做增量更新

如果你需要一次性写入多个带动态键的条目,可以用字典存储动态键映射关系,直接调用Firebase的增量更新接口,不需要手动转JSON:

public void CreateUser()
{
    string userID = user.UserId;
    Username userInfo = new Username(registerUsername.text, userID);
    // 键为动态userID,值为要存储的用户数据
    var updateData = new Dictionary<string, object>
    {
        { userID, userInfo }
    };
    // 增量更新usernames节点,不会覆盖其他用户的已有数据
    dbReference.Child("usernames").UpdateChildrenAsync(updateData);
}

注意:SetValueAsync/SetRawJsonValueAsync是覆盖式写入,只要不是要清空整个节点的所有内容,写入单条动态键对应的数据时,要么定位到具体的动态键子节点再写入,要么用UpdateChildrenAsync做增量更新。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:01:29