更新Firebase Realtime Database触发模拟器中断且数据未更新如何解决
故障原因与修复方案
你遇到的模拟器中断本质是未捕获异常触发的应用崩溃,核心触发点与修复方法如下:
核心问题排查
- 空引用异常风险:你在
UpdatePet中使用PetNameEntry.Text作为查询条件,若用户修改了宠物名输入框内容,会匹配不到原有档案,导致toUpdatePet为null,调用toUpdatePet.Key直接抛出空引用异常 - 异常未捕获:
async void类型的按钮点击事件没有加异常捕获,异步操作抛出的任何未处理异常都会直接终止应用 - 其他潜在风险:
PetProfile类无公共无参构造函数、Firebase数据库无写入权限、配置错误都会导致PutAsync抛出异常
代码修改
1. 修正FirebaseHelper的UpdatePet方法
public async Task UpdatePet(string oldPetName, string newPetName, string breed, string dob, string weight, string gender, string careinformation) { var useremail = Preferences.Get("UserSignInEmail", ""); var toUpdatePet = (await firebase .Child("PetProfiles") .OnceAsync<PetProfile>()).FirstOrDefault(a => a.Object.PetName == oldPetName && a.Object.UserEmail == useremail); // 提前做空判断避免空引用 if (toUpdatePet == null) { throw new InvalidOperationException("未匹配到对应宠物档案"); } try { await firebase .Child("PetProfiles") .Child(toUpdatePet.Key) .PutAsync(new PetProfile() { UserEmail = useremail, PetName = newPetName, Breed = breed, DOB = dob, Weight = weight, Gender = gender, CareInformation = careinformation }); } catch (Exception ex) { // 输出调试日志定位具体错误 System.Diagnostics.Debug.WriteLine($"更新失败:{ex.Message}\n堆栈信息:{ex.StackTrace}"); throw; } }
2. 修正editpetdetails.cs的点击事件
private async void Button_Clicked(object sender, EventArgs e) { try { var pet = await firebaseHelper.GetPet(PetName); if (pet != null) { await firebaseHelper.UpdatePet( PetName, // 用原始宠物名查询旧记录 PetNameEntry.Text, // 新宠物名从输入框取 BreedEntry.Text, DOBEntry.Date.ToString(), WeightEntry.SelectedItem?.ToString() ?? string.Empty, GenderEntry.SelectedItem?.ToString() ?? string.Empty, PetCareInfoEntry.Text); await DisplayAlert("成功", "宠物档案更新完成", "确定"); } else { await DisplayAlert("错误", "未找到对应宠物档案", "确定"); } } catch (Exception ex) { await DisplayAlert("错误", $"更新失败:{ex.Message}", "确定"); } }
额外检查项
- 确认
PetProfile类包含公共无参构造函数,Firebase SDK序列化需要依赖无参构造:
public class PetProfile { // 必须保留无参构造 public PetProfile() {} public string UserEmail { get; set; } public string PetName { get; set; } public string Breed { get; set; } public string DOB { get; set; } public string Weight { get; set; } public string Gender { get; set; } public string CareInformation { get; set; } }
- 确认Firebase Realtime Database规则开放了对应路径的写入权限,示例规则:
{ "rules": { "PetProfiles": { ".read": "auth != null", ".write": "auth != null" } } }
- 确认Firebase客户端初始化时填入的数据库URL、ApiKey等配置参数完全正确
内容的提问来源于stack exchange,提问作者user2773611
相关产品推荐
相关产品推荐

