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

在Xamarin Forms中使用Firebase实现用户关联联系人存储问题

解决方案

问题根源

  1. 用户注册使用PostAsync会生成随机节点ID,无法通过用户名直接定位用户节点,后续关联联系人时找不到对应路径
  2. 联系人直接存储在独立的Registrations节点,未与当前登录用户的节点关联

具体修改步骤

1. 修改用户注册逻辑,用用户名作为节点键

将注册用户的PostAsync改为PutAsync,直接以用户名作为Users下的子节点键,避免自动生成随机ID:

public async Task<bool> RegisterUser(string username, string password)
{
    try
    {
        if(await UserExist(username, password))
        {
            throw new Exception("O usuário já existe");
        }

        // 用用户名作为节点键,替代自动生成的随机ID
        await Client.Child("Users")
            .Child(username)
            .PutAsync(new Users()
            {
                User = username,
                Password = password
                // 无需初始化List<Contacts>,Firebase会自动创建Contacts子节点
            });
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}

2. 修改联系人添加逻辑,关联到当前用户节点

添加联系人时传入当前登录的用户名,将联系人存储到该用户的Contacts子节点下:

// 新增参数:当前登录的用户名currentUsername
public async Task<bool> RegisterContact(string currentUsername, string name, string telefone1, string telefone2, string email, string cep, string logradouro, string numero, string bairro, string complemento, string cidade, string uf)
{
    try
    {
        // 定位到当前用户的Contacts节点,用PostAsync生成唯一联系人ID
        await Client.Child("Users")
            .Child(currentUsername)
            .Child("Contacts")
            .PostAsync(new Contacts()
            {
                Name = name,
                Tell1 = telefone1,
                Tell2 = telefone2,
                Email = email,
                Cep = cep,
                Logradouro = logradouro,
                Numero = numero,
                Bairro = bairro,
                Complemento = complemento,
                Cidade = cidade,
                Uf = uf
            });

        return true;
    }
    catch (Exception)
    {
        return false;
    }
}

3. 读取联系人时仅获取当前用户的数据

读取联系人时定位到当前用户的Contacts节点,确保只加载该用户的专属联系人:

public async Task<List<Contacts>> GetUserContacts(string currentUsername)
{
    var contactsSnapshot = await Client.Child("Users")
        .Child(currentUsername)
        .Child("Contacts")
        .OnceAsync<Contacts>();
    
    return contactsSnapshot.Select(snap => snap.Object).ToList();
}

额外说明

  • 建议调整Users类的结构,移除List<Contacts>字段,Firebase Realtime Database更适合用子节点存储集合数据,而非内嵌列表,这样便于单独增删改查单个联系人
  • 登录后需保存当前用户名,调用添加/读取联系人方法时传入该用户名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:49:51