更新firebase实时数据库xamarin表单中的单个数据

更新firebase实时数据库xamarin表单中的单个数据,firebase,firebase-realtime-database,xamarin.forms,updates,Firebase,Firebase Realtime Database,Xamarin.forms,Updates,我正在使用Firebase实时数据库,我想修改单个数据 以下是我的数据库的Json: "Users" : { "h31QEhvv4pdzbyqHkwyrd8MI5Fu2" : { "Books" : { "codebook0" : { "Author" : "De Amicis", "Cove

我正在使用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();
        }
公共异步任务getReaders() { 返回(等待火力基地) .Child(“用户”) .Child(auth.CurrentUser()) .儿童(“书籍”) .OrderBy(“状态”) .EqualTo(“阅读”) .OnceAsync())。选择(项=> 新用户{ Title=item.Object.Title, Author=item.Object.Author, 流派=item.Object.Genre, 封面=item.Object.Cover }).ToList(); } 现在,我在单个viewcell中有一个按钮,单击它,我想将图书状态更改为“已读”

我试着这样做:

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");
            
        }

公共异步任务更新状态(字符串状态)
{
var toUpdateStatus=(等待firebase
.Child(“用户”)
.Child(auth.CurrentUser())
.儿童(“书籍”)
.OnceAsync())。其中(a=>a.Object.Status==Status);
等待火力基地
.Child(“用户”)
.Child(auth.CurrentUser())
.儿童(“书籍”)
.Child(toUpdateStatus.Key)
.PutAsync(新用户(){Status=Status});
}
私有异步void ReadClicked(对象发送方,事件参数e)
{
按钮btn=(按钮)发送器;
var book=(utinte)btn.BindingContext;
var状态=账面状态;
等待更新状态(“读取”);
}
但是,很明显,它不起作用。有什么想法吗?

DB 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);
    }
public async Task UpdateStatus(字符串oldStatus,字符串newStatus)
{
var toUpdateStatus=(等待firebase
.Child(“用户”)
.Child(“h31qehv4pdzbyqhkwyrd8mi5fu2”)
.儿童(“书籍”)
.OnceAsync())。其中(a=>a.Object.Status==oldStatus);
toUpdateStatus.Object.Status=newStatus;
等待火力基地
.Child(“用户”)
.Child(“h31qehv4pdzbyqhkwyrd8mi5fu2”)
.儿童(“书籍”)
.Child(toUpdateStatus.Key)
.PutAsync(toUpdateStatus.Object);
}

谢谢您的回答!不幸的是,它无法工作,它在.Child(toUpdateStatus.Key)row.var status=book.status处为我提供了NullReferenceException。检查状态值。它应该是“Reading”,并检查auth.CurrentUser()应该是“H311QEv4PDZBYQHKWYRD8MI5FU2”,根据您发布的json。它不会给出NullReferenceException。我检查过了。是的,不应该,但它确实检查过。我就是这样做的,它给了我toUpdateStatus.Key的异常,就像它在itI中什么都没有一样。我更新了我的答案。我在firebase数据库中创建了与我的答案(与您的答案相同)相同的Json数据,并调用了UpdateStatus方法,数据库中的值正在更新。