Unity C#能否向Firebase实时数据库发送动态Key键名
问题
当前Firebase数据库结构如下所示:
实现目标
在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
相关产品推荐
相关产品推荐

