Xamarin使用FirebaseDatabase.net时如何替换Firebase子节点唯一ID为用户UID
问题背景
在Xamarin项目中使用NuGet包FirebaseDatabase.net做Firebase开发时,需要将实时数据库中子节点自动生成的唯一ID替换为对应用户的UID,当前数据库结构如下:
原有实现代码未达到预期效果,用于存储数据的userinfo类定义如下:
class userinfo { public string firstName { get; set; } public string secondName { get; set; } }
核心错误点
原有代码不生效的两个直接原因:
- 写入方法选择错误:
PostAsync对应Firebase的Push操作,无论前置路径如何指定,调用后都会在目标路径下自动生成随机push ID作为新节点键,无法自定义键名 - 路径参数写死:代码中
.Child("some uid")为固定字符串,没有传入注册接口返回的真实用户UID
修复方案
做两处改动即可实现需求:
- 注册成功后直接从返回结果中取用户UID:
auth.User.LocalId,将该值作为users节点下的子路径 - 将
PostAsync替换为PutAsync,该方法会直接将数据写入指定的完整路径,不会额外生成随机子节点
修复后完整代码
private async void signupbutton_Clicked(object sender, EventArgs e) { // 替换为你自己的Firebase实时数据库地址 FirebaseClient firebaseClient = new FirebaseClient("你的Firebase数据库地址"); try { var authProvider = new FirebaseAuthProvider(new FirebaseConfig(webApiKey)); var auth = await authProvider.CreateUserWithEmailAndPasswordAsync(UserNewEmail.Text, UserNewPassword.Text); // 获取当前注册用户的真实UID string userUid = auth.User.LocalId; // 以UID为键存储用户信息 await firebaseClient .Child("users") .Child(userUid) .PutAsync(new userinfo { firstName = UserFirstName.Text, secondName = UsersecondName.Text }) ; await App.Current.MainPage.DisplayAlert("提示", "注册成功", "确定"); } catch (Exception ex) { await App.Current.MainPage.DisplayAlert("提示", "注册失败:" + ex.Message, "OK"); } }
补充说明
- 修复后写入的数据库结构为:
根节点 > users > 用户UID > firstName/secondName字段,完全符合自定义键为UID的需求 - 如果运行时提示无写入权限,可到Firebase控制台调整实时数据库安全规则,开发测试阶段可临时配置为需登录才能读写,上线前按需收紧规则即可:
{ "rules": { ".read": "auth != null", ".write": "auth != null" } }
内容的提问来源于stack exchange,提问作者noor
相关产品推荐
相关产品推荐

