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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:57:34