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

Так что в моей базе данных реального времени это будет выглядеть так:

ss: {
  xx: {
    id: 1
  },
  yy: {
    id: 2
  },
  ...
}

Я пытался сначала получить дочерний элемент с наибольшим идентификатором FirebaseRef.child('ss').orderByChild('id').limitToLast(1), а затем сделать +1 для полученного значения .. затем push новая запись с этим. Но это может привести к удвоению идентификаторов, так как между выборкой и пу sh кто-то другой может сделать новую запись. Я изучил функцию transaction, но не смог понять, нужно ли использовать ее в моем сценарии (так как она получает и обновляет только значения?).

1 Ответ

1 голос
/ 05 января 2020

Один из возможных подходов - поддерживать счетчик, и каждый раз, когда вам нужно сгенерировать новый идентификатор, увеличивайте этот счетчик в транзакции и считывайте значение:

Следующее должно выполнить уловка:

  //Declare a function that increment a counter in a transaction
  function getId() {
    var counterRef = firebase.database().ref('counter');
    return counterRef.transaction(function(currentId) {
      return currentId + 1;
    });
  }


  //Call the asynchronous getID() function
  getId().then(function(transactionResult) {
    var newId = transactionResult.snapshot.val();
    console.log(newId);
    firebase.database().ref('ss/xx').set({id: newId});
  });

Вам не нужно создавать узел counter, он будет создан автоматически при первом вызове функции getId().

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