在Xamarin Forms中使用Firebase实现用户关联联系人存储问题
解决方案
问题根源
- 用户注册使用
PostAsync会生成随机节点ID,无法通过用户名直接定位用户节点,后续关联联系人时找不到对应路径 - 联系人直接存储在独立的
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
相关产品推荐
相关产品推荐

