Итак, читая документацию , похоже, что SetRawJsonValueAsync
перезаписывает дочерние узлы и удаляет их:
Используя SetValueAsyn c () или SetRawJsonValueAsyn c () таким образом перезаписывает данные в указанном месте, включая любые дочерние узлы.
Вторая половина этой цитаты, однако:
Однако вы все еще можно обновить ребенка без переписывания всего объекта. Если вы хотите разрешить пользователям обновлять свои профили, вы можете обновить имя пользователя следующим образом:
mDatabaseRef.Child("users").Child(userId).Child("username").SetValueAsync(name);
Чтобы воспроизвести эту логику c в вашем коде, я бы сделал что-то вроде этого:
var root = FirebaseDatabase.DefaultInstance.RootReference.GetReference("User");
var nameTask = root.GetReference("name").SetValueAsync(name);
var ageTask = root.GetReference("age").SetValueAsync(age);
Task.WhenAll(nameTask, ageTask).ContinueWithOnMainThread(taskUpdate=>{ ...
В качестве альтернативы вы можете использовать Транзакция . Это будет иметь очень псевдокод, поэтому я прошу прощения за это:
FirebaseDatabase.DefaultInstance.RootReference.GetReference("User").RunTransaction(mutableData =>{
// TODO: handle null data in case you hit an empty cache
mutableData.Child("name").Value = name;
mutableData.Child("age").Value = age;
return TransactionResult.Success(mutableData);
}).ContinueWithOnMainThread(dataSnapshot=> ...
Надеюсь, это поможет! Если вы хотите использовать эту функцию как ожидаемую, вы всегда можете подать запрос на поддержку на сайте поддержки или на github .
- Патрик