首页 > 解决方案 > 更新firebase实时数据库xamarin表单中的单个数据

问题描述

我正在使用 Firebase 实时数据库,我想修改单个数据。

这是我的数据库的 Json:

"Users" : {
    "h31QEhvv4pdzbyqHkwyrd8MI5Fu2" : {
      "Books" : {
        "codebook0" : {
          "Author" : "De Amicis",
          "Cover" : "https://firebasestorage.googleapis.com....",
          "Genre" : "Children",
          "Status" : "Reading",
          "Title" : "Cuore"
        }

我用这种方法在列表视图中检索阅读书籍:

public async Task<List<User>> GetReadings()
        {
            return (await firebase
              .Child("Users")
              .Child(auth.CurrentUser())
              .Child("Books")
              .OrderBy("Status")
              .EqualTo("Reading")
              .OnceAsync<User>()).Select(item =>
              new User {
                  Title = item.Object.Title,
                  Author = item.Object.Author,
                  Genre = item.Object.Genre,
                  Cover = item.Object.Cover
              }).ToList();
        }

现在我在单个视单元中有一个按钮,通过单击它,我想将图书状态更改为“已读”。

我试过这样:

public async Task UpdateStatus(string status)
         {
             var toUpdateStatus = (await firebase
               .Child("Users")
               .Child(auth.CurrentUser())
               .Child("Books")
               .OnceAsync<User>()).Where(a => a.Object.Status == status).FirstOrDefault();

             await firebase
               .Child("Users")
               .Child(auth.CurrentUser())
               .Child("Books")
               .Child(toUpdateStatus.Key)
               .PutAsync(new User() { Status = status });
         }

private async void ReadClicked(object sender, EventArgs e)
        {
            Button btn = (Button)sender;

            var book = (Utente)btn.BindingContext;

            var status = book.Status;
            await UpdateStatus("read");
            
        }

但是,显然,它不起作用。任何想法?

标签: firebasefirebase-realtime-databasexamarin.formsupdates

解决方案


数据库 JSON

{
  "Users" : {
    "h31QEhvv4pdzbyqHkwyrd8MI5Fu2" : {
      "Books" : {
        "codebook0" : {
          "Status" : "Reading",
          "Title" : "abc"
        },
        "codebook1" : {
          "Status" : "Reading",
          "Title" : "sdf"
        }
      }
    }
  }
}

您必须同时通过旧状态和新状态。

await UpdateStatus("Reading","read");

现在 UpdateStatus 方法是

public async Task UpdateStatus(string oldStatus, string newStatus)
    {
        var toUpdateStatus = (await firebase
          .Child("Users")
          .Child("h31QEhvv4pdzbyqHkwyrd8MI5Fu2")
          .Child("Books")
          .OnceAsync<User>()).Where(a => a.Object.Status == oldStatus).FirstOrDefault();

        toUpdateStatus.Object.Status = newStatus;

        await firebase
          .Child("Users")
          .Child("h31QEhvv4pdzbyqHkwyrd8MI5Fu2")
          .Child("Books")
          .Child(toUpdateStatus.Key)
          .PutAsync(toUpdateStatus.Object);
    }

推荐阅读