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

Работа со списками данных в Интернете

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

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

// Get a reference to the database service
var database = firebase.database();

Списки чтения и записи

Добавить в список данных

Используйте метод push() для добавления данных в список в многопользовательских приложениях. Метод push() генерирует уникальный ключ каждый раз, когда новый дочерний элемент добавляется к указанной ссылке Firebase. Используя эти автоматически сгенерированные ключи для каждого нового элемента в списке, несколько клиентов могут добавлять дочерние элементы в одно и то же место одновременно без конфликтов записи. Уникальный ключ, сгенерированный методом push() , основан на отметке времени, поэтому элементы списка автоматически упорядочиваются в хронологическом порядке.

Вы можете использовать ссылку на новые данные, возвращаемые методом push() чтобы получить значение автоматически сгенерированного ключа дочернего элемента или установить данные для дочернего элемента. Свойство .key ссылки push() содержит автоматически сгенерированный ключ.

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

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

// Create a new post reference with an auto-generated id
var newPostRef = postListRef.push();
newPostRef.set({
    // ...
});

Слушайте детские события

Дочерние события запускаются в ответ на определенные операции, которые происходят с дочерними элементами узла из операции, такой как новый дочерний элемент, добавленный с push() метода push() или дочерний элемент, обновляемый с помощью метода update() .

Мероприятие Типичное использование
child_added Получение списков элементов или прослушивание добавлений к списку элементов. Это событие запускается один раз для каждого существующего дочернего элемента, а затем снова каждый раз, когда новый дочерний элемент добавляется к указанному пути. Слушателю передается снимок, содержащий данные нового ребенка.
child_changed Проследите за изменениями элементов в списке. Это событие запускается каждый раз при изменении дочернего узла. Это включает любые модификации потомков дочернего узла. Снимок, переданный прослушивателю событий, содержит обновленные данные для дочернего элемента.
child_removed Прослушивайте элементы, удаляемые из списка. Это событие запускается при удалении непосредственного дочернего элемента. Снимок, переданный в блок обратного вызова, содержит данные для удаленного дочернего элемента.
child_moved Следите за изменениями порядка элементов в упорядоченном списке. События child_moved всегда следуют за событием child_changed которое вызвало изменение порядка элемента (на основе вашего текущего метода упорядочивания).

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

var commentsRef = firebase.database().ref('post-comments/' + postId);
commentsRef.on('child_added', function(data) {
  addCommentElement(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_changed', function(data) {
  setCommentValues(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_removed', function(data) {
  deleteComment(postElement, data.key);
});

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

Хотя прослушивание дочерних событий является рекомендуемым способом чтения списков данных, есть ситуации, когда прослушивание событий значений в ссылке на список полезно.

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

Даже если для запроса есть только одно совпадение, снимок все равно остается списком; он просто содержит один элемент. Чтобы получить доступ к элементу, вам нужно перебрать результат:

ref.once('value', function(snapshot) {
  snapshot.forEach(function(childSnapshot) {
    var childKey = childSnapshot.key;
    var childData = childSnapshot.val();
    // ...
  });
});

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

Сортировка и фильтрация данных

Вы можете использовать класс Realtime Database Query для извлечения данных, отсортированных по ключу, по значению или по значению дочернего элемента. Вы также можете отфильтровать отсортированный результат по определенному количеству результатов или диапазону ключей или значений.

Сортировать данные

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

Метод использование
orderByChild() Упорядочивайте результаты по значению указанного дочернего ключа или вложенного дочернего пути.
orderByKey() Упорядочивайте результаты по дочерним ключам.
orderByValue() Упорядочивайте результаты по дочерним значениям.

Вы можете использовать только один метод заказа за раз. Многократный вызов метода упорядочивания в одном и том же запросе вызывает ошибку.

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

var myUserId = firebase.auth().currentUser.uid;
var topUserPostsRef = firebase.database().ref('user-posts/' + myUserId).orderByChild('starCount');

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

Вызов orderByChild() указывает дочерний ключ для упорядочивания результатов. В этом случае сообщения сортируются по значению их соответствующего "starCount" . Запросы также могут быть упорядочены по вложенным дочерним элементам, если у вас есть данные, которые выглядят следующим образом:

"posts": {
  "ts-functions": {
    "metrics": {
      "views" : 1200000,
      "likes" : 251000,
      "shares": 1200,
    },
    "title" : "Why you should use TypeScript for writing Cloud Functions",
    "author": "Doug",
  },
  "android-arch-3": {
    "metrics": {
      "views" : 900000,
      "likes" : 117000,
      "shares": 144,
    },
    "title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)",
    "author": "Doug",
  }
},

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

 
var mostViewedPosts = firebase.database().ref('posts').orderByChild('metrics/views');

Дополнительные сведения о порядке упорядочивания других типов данных см. В разделе Порядок упорядочения данных запроса .

Фильтрация данных

Чтобы фильтровать данные, вы можете комбинировать любой из методов limit или range с методом упорядочивания при построении запроса.

Метод использование
limitToFirst() Устанавливает максимальное количество элементов, возвращаемых с начала упорядоченного списка результатов.
limitToLast() Задает максимальное количество элементов, возвращаемых из конца упорядоченного списка результатов.
startAt() Возвращать элементы, которые больше или равны указанному ключу или значению, в зависимости от выбранного метода упорядочивания.
endAt() Возвращать элементы меньше или равные указанному ключу или значению, в зависимости от выбранного метода упорядочивания.
equalTo() Возвращать элементы, равные указанному ключу или значению, в зависимости от выбранного метода упорядочивания.

В отличие от методов упорядочивания, вы можете комбинировать несколько функций ограничения или диапазона. Например, вы можете комбинировать startAt() и endAt() чтобы ограничить результаты указанным диапазоном значений.

Ограничьте количество результатов

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

По мере изменения элементов вы получаете события child_added для элементов, которые входят в запрос, и события child_removed для элементов, которые выпадают из него, так что общее количество остается на уровне 100.

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

var recentPostsRef = firebase.database().ref('posts').limitToLast(100);

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

Фильтр по ключу или значению

Вы можете использовать startAt() , endAt() и equalTo() для выбора произвольных точек начала, окончания и эквивалентности для запросов. Это может быть полезно для разбивки данных на страницы или поиска элементов с дочерними элементами, имеющими определенное значение.

Как упорядочиваются данные запроса

В этом разделе объясняется, как данные сортируются каждым из методов упорядочивания в классе Query .

orderByChild

При использовании orderByChild() данные, содержащие указанный дочерний ключ, упорядочиваются следующим образом:

  1. Сначала идут потомки с null значением для указанного дочернего ключа.
  2. Следующими идут потомки со значением false для указанного дочернего ключа. Если несколько дочерних элементов имеют значение false , они лексикографически сортируются по ключу.
  3. Следующими идут потомки со значением true для указанного дочернего ключа. Если несколько дочерних элементов имеют значение true , они лексикографически сортируются по ключу.
  4. Далее идут дочерние элементы с числовым значением, отсортированные по возрастанию. Если несколько дочерних узлов имеют одинаковое числовое значение для указанного дочернего узла, они сортируются по ключу.
  5. Строки идут после чисел и сортируются лексикографически в порядке возрастания. Если несколько дочерних узлов имеют одинаковое значение для указанного дочернего узла, они упорядочиваются лексикографически по ключу.
  6. Объекты идут последними и лексикографически сортируются по ключам в порядке возрастания.

orderByKey

При использовании orderByKey() для сортировки данных данные возвращаются в порядке возрастания по ключу.

  1. Сначала идут дочерние элементы с ключом, который может быть проанализирован как 32-разрядное целое число, отсортированные в порядке возрастания.
  2. Далее следуют дочерние элементы со строковым значением в качестве ключа, отсортированные лексикографически в порядке возрастания.

orderByValue

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

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

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

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

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

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