Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Чтение и запись данных в Интернете

Получите ссылку на базу данных

Для чтения или записи данных из базы данных вам понадобится экземпляр firebase.database.Reference :

var database = firebase.database();

Чтение и запись данных

Этот документ описывает основы получения данных, а также порядок и фильтрацию данных Firebase.

Данные Firebase извлекаются путем присоединения асинхронного прослушивателя к firebase.database.Reference . Слушатель запускается один раз для начального состояния данных и снова при каждом изменении данных.

Основные операции записи

Для основных операций записи вы можете использовать set() для сохранения данных по указанной ссылке, заменяя любые существующие данные по этому пути. Например, приложение для ведения социального блога может добавить пользователя с помощью set() следующим образом:

function writeUserData(userId, name, email, imageUrl) {
  firebase.database().ref('users/' + userId).set({
    username: name,
    email: email,
    profile_picture : imageUrl
  });
}

Использование set() перезаписывает данные в указанном месте, включая любые дочерние узлы.

Слушайте важные события

Чтобы читать данные по пути и отслеживать изменения, используйте методы on() или once() firebase.database.Reference для наблюдения за событиями.

Событие Типичное использование
value Читайте и слушайте изменения всего содержимого пути.

Вы можете использовать событие value чтобы прочитать статический снимок содержимого по заданному пути, поскольку они существовали во время события. Этот метод запускается один раз при подключении слушателя и снова каждый раз, когда данные, включая дочерние, изменяются. Обратному вызову события передается моментальный снимок, содержащий все данные в этом месте, включая дочерние данные. Если данных нет, моментальный снимок вернет false при вызове exists() и null при вызове val() для него.

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

var starCountRef = firebase.database().ref('posts/' + postId + '/starCount');
starCountRef.on('value', (snapshot) =>{
  const data = snapshot.val();
  updateStarCount(postElement, data);
});

Прослушиватель получает snapshot , содержащий данные в указанном месте в базе данных на момент события. Вы можете получить данные из snapshot с помощью метода val() .

Прочитать данные один раз

В некоторых случаях вам может потребоваться моментальный снимок ваших данных без отслеживания изменений, например, при инициализации элемента пользовательского интерфейса, который вы не ожидаете изменить. Вы можете использовать метод once() чтобы упростить этот сценарий: он срабатывает один раз и больше не запускается.

Это полезно для данных, которые необходимо загрузить только один раз, и не предполагается, что они будут часто меняться или требовать активного прослушивания. Например, приложение для ведения блога в предыдущих примерах использует этот метод для загрузки профиля пользователя, когда он начинает создание нового сообщения:

var userId = firebase.auth().currentUser.uid;
return firebase.database().ref('/users/' + userId).once('value').then((snapshot) => {
  var username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
  // ...
});

Обновление или удаление данных

Обновить определенные поля

Чтобы одновременно писать в определенные дочерние узлы, не перезаписывая другие дочерние узлы, используйте метод update() .

При вызове update() вы можете обновить дочерние значения нижнего уровня, указав путь для ключа. Если данные хранятся в нескольких местах для лучшего масштабирования, вы можете обновить все экземпляры этих данных, используя разветвление данных .

Например, приложение для ведения социального блога может создать сообщение и одновременно обновить его, добавив в него недавний канал активности и канал активности публикующего пользователя, используя следующий код:

function writeNewPost(uid, username, picture, title, body) {
  // A post entry.
  var postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  var newPostKey = firebase.database().ref().child('posts').push().key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  var updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return firebase.database().ref().update(updates);
}

В этом примере push() для создания сообщения в узле, содержащего сообщения для всех пользователей в /posts/$postid и одновременного получения ключа. Затем ключ можно использовать для создания второй записи в сообщениях /user-posts/$userid/$postid в /user-posts/$userid/$postid .

Используя эти пути, вы можете выполнять одновременные обновления в нескольких местах в дереве JSON с помощью одного вызова update() , например, как в этом примере создается новый пост в обоих местах. Таким образом, одновременные обновления являются атомарными: либо все обновления выполняются успешно, либо все обновления не выполняются.

Добавить обратный вызов о завершении

Если вы хотите знать, когда ваши данные были зафиксированы, вы можете добавить обратный вызов завершения. Оба set() и update() принимают дополнительный обратный вызов завершения, который вызывается, когда запись была зафиксирована в базе данных. Если вызов был неудачным, обратному вызову передается объект ошибки, указывающий, почему произошла ошибка.

firebase.database().ref('users/' + userId).set({
  username: name,
  email: email,
  profile_picture : imageUrl
}, (error) => {
  if (error) {
    // The write failed...
  } else {
    // Data saved successfully!
  }
});

Удалить данные

Самый простой способ удалить данные - вызвать remove() для ссылки на расположение этих данных.

Вы также можете удалить, указав null в качестве значения для другой операции записи, такой как set() или update() . Вы можете использовать этот метод с update() чтобы удалить несколько дочерних элементов за один вызов API.

Получите Promise

Чтобы узнать, когда ваши данные переданы на сервер базы данных Firebase Realtime, вы можете использовать Promise . И set() и update() могут возвращать Promise , которое можно использовать, чтобы узнать, когда запись зафиксирована в базе данных.

Отключить слушателей

Обратные вызовы удаляются путем вызова метода off() в ссылке на базу данных Firebase.

Вы можете удалить одного слушателя, передав его в качестве параметра в off() . Вызов off() в месте без аргументов удаляет всех слушателей в этом месте.

Вызов off() для родительского слушателя не удаляет автоматически слушателей, зарегистрированных на его дочерних узлах; off() также должен вызываться для всех дочерних слушателей, чтобы удалить обратный вызов.

Сохранить данные как транзакции

При работе с данными, которые могут быть повреждены параллельными модификациями, такими как добавочные счетчики, вы можете использовать операцию транзакции . Вы можете дать этой операции функцию обновления и дополнительный обратный вызов завершения. Функция обновления принимает текущее состояние данных в качестве аргумента и возвращает новое желаемое состояние, которое вы хотите записать. Если другой клиент записывает в это место до того, как ваше новое значение будет успешно записано, ваша функция обновления вызывается снова с новым текущим значением, и запись повторяется.

Например, в примере приложения для ведения социального блога вы можете разрешить пользователям отмечать и снимать пометки с публикаций и отслеживать, сколько звезд получил сообщение, следующим образом:

function toggleStar(postRef, uid) {
  postRef.transaction((post) => {
    if (post) {
      if (post.stars && post.stars[uid]) {
        post.starCount--;
        post.stars[uid] = null;
      } else {
        post.starCount++;
        if (!post.stars) {
          post.stars = {};
        }
        post.stars[uid] = true;
      }
    }
    return post;
  });
}

Использование транзакции предотвращает неправильное подсчет звезд, если несколько пользователей отмечают один и тот же пост одновременно или у клиента были устаревшие данные. Если транзакция отклонена, сервер возвращает текущее значение клиенту, который снова запускает транзакцию с обновленным значением. Это повторяется до тех пор, пока транзакция не будет принята или вы не прервете транзакцию.

Запись данных в автономном режиме

Если клиент потеряет сетевое соединение, ваше приложение продолжит работать правильно.

Каждый клиент, подключенный к базе данных Firebase, поддерживает собственную внутреннюю версию любых активных данных. Когда данные записываются, они сначала записываются в эту локальную версию. Затем клиент Firebase синхронизирует эти данные с удаленными серверами баз данных и с другими клиентами по принципу «максимальных усилий».

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

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

Следующие шаги