React + Firebase: как добавить элемент в список данных в базу данных Firebase в реальном времени - PullRequest
1 голос
/ 11 ноября 2019

Я использую базу данных в режиме реального времени реагирования и запуска. Я хочу создать список для каждого пользователя. Список идентификаторов для последующего поиска файлов в хранилище. В этом случае, что является лучшим способом для создания и добавления идентификатора в список в базе данных? (Не список данных, данные, хранящиеся в базе данных - это список)

Итак, я имею в виду два метода. Я напишу в псевдокоде

//Method 1
//get id list
receivedList = getKeyListFromDB()
//generate ID
newID = generateID()
// append new id
receivedList.append(newID)
//set value with updated list
updateDB(receivedList)

//Method 2
// Using the list provided by the firebase
newRef = firebase.database().ref().child('pathToList').push()
newRef.set({
      key: newRef.key
    })

Я собирался метод 1, но не смог найти способ для генерации идентификатора. И получение списка для обновления оказалось неэффективным. Поэтому я попытался найти другой метод. Но я не могу найти хороший способ сделать это.

Решение добавить значение в список в базе данных

Я решил использовать метод транзакции. Но если есть способ решить, используя push, пожалуйста, ответьте.

Ответы [ 3 ]

2 голосов
/ 11 ноября 2019

Существует много причин, по которым в Firebase есть встроенная операция push() для добавления дочернего узла в список. Фактически, вы уже прослушали один из них в своем вопросе:

получение списка для обновления показалось неэффективным

Другие причины заключаются в том, что push-идентификаторы будут работать, покаВаше приложение работает в автономном режиме, и оно гораздо лучше масштабируется для нескольких пользователей.

Если вы хотите узнать больше о том, почему вы должны использовать push(), прочитайте Рекомендации: массивы в Firebase .

0 голосов
/ 11 ноября 2019

Я создаю другой ответ, чтобы показать различные виды решений. В этом решении использование push лучше, чем использование transaction.

// Get a new ref by push
const newDatabaseRouteRef = firebase.database.ref().child('users/' + user.uid + '/routes').push()
// Set the value to the key of received ref
newDatabaseRouteRef.set(newDatabaseRouteRef.key)

Это лучше, потому что

  1. Транзакция требует многократных циклов, а push () нет,таким образом сокращая время.
  2. Более безопасно в соответствии с этой статьей .

Это дает тот же результат, потому что даже при использовании списка, когда список сохраняется в базе данных Firebase, он сохраняется как объект. ex) ["a","b","c"] => {0:"a",1:"b",2:"c"}

0 голосов
/ 11 ноября 2019

Во-первых, вы можете сгенерировать уникальный ключ, используя приведенный ниже код

const newID = firebase.database.ref().push().key

Согласно этому ответу , всякий раз, когда вы нажимаете ссылку на базу данных, генерируется новый узел данныхс уникальным ключом, который включает метку времени сервера. Эти ключи выглядят как -KiGh_31GA20KabpZBfa.

Из-за отметки времени вы можете быть уверены, что данный ключ будет уникальным, без проверки других ключей в вашей базе данных.

Во-вторых, выможно добавить элемент в список в базе данных, используя transaction.

const newID = firebase.database.ref().push().key
//user is user object from firebase auth module
const newDatabaseRouteRef = firebase.database.ref().child('users/' + user.uid + '/ids')
// if null, create a new list with id, if not add newID to list
newDatabaseRouteRef.transaction((currentValue) => {
  return currentValue ? currentValue.push(newID) : [newID]
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...