Unitiy Firebase - обновление нескольких данных без удаления других узлов - PullRequest
0 голосов
/ 05 марта 2020

Я использую Firebase в Unity и пытаюсь обновить несколько значений в узле игрока. У игрока есть несколько узлов, но допустим, я хочу просто обновить имя и возраст. Проблема заключается в том, что обновление нескольких данных на основе документации приводит к удалению других узлов проигрывателя, которые не были обновлены. (ie при обновлении только имени и возраста счет будет удален)

Я пытался использовать SetRawJsonValueAsyn c и UpdateChildrenAsyn c, и оба удаляли другие узлы игрока. Документация говорит, что UpdateChildrenAsyn c не должен специально удалять другие узлы.

https://firebase.google.com/docs/database/unity/save-data

Мой вопрос, если я делаю что-то не так, так как это должно работать или есть другой способ обновить только указанные узлы c без удаления других узлов. Я просто ищу простое обновление, как в JS. (.update ({имя: «Джек», возраст: 20}))

Код, который у меня есть

PlayerData newServerData = new ServerPlayerData(name, age);
Dictionary<string, object> newServerDataD = newServerData.ToDictionary();
Dictionary<string, object> childUpdates = new Dictionary<string, object>();
childUpdates["User"] = newServerDataD;

FirebaseDatabase.DefaultInstance.GetReference("")
  .UpdateChildrenAsync(childUpdates)
  .ContinueWithOnMainThread(taskUpdate => {  ....   

1 Ответ

1 голос
/ 05 марта 2020

Итак, читая документацию , похоже, что 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 .

- Патрик

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...