You need to enable JavaScript to run this app. 更新Firebase Realtime Database触发模拟器中断且数据未更新如何解决
优惠活动
大模型
产品
解决方案
定价
更多

更新Firebase Realtime Database触发模拟器中断且数据未更新如何解决

故障原因与修复方案

你遇到的模拟器中断本质是未捕获异常触发的应用崩溃,核心触发点与修复方法如下:

核心问题排查

  1. 空引用异常风险:你在UpdatePet中使用PetNameEntry.Text作为查询条件,若用户修改了宠物名输入框内容,会匹配不到原有档案,导致toUpdatePet为null,调用toUpdatePet.Key直接抛出空引用异常
  2. 异常未捕获:async void类型的按钮点击事件没有加异常捕获,异步操作抛出的任何未处理异常都会直接终止应用
  3. 其他潜在风险: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 03:15:03