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

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

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

Веб-версия 9

import { getDatabase } from "firebase/database";

const database = getDatabase();

Веб-версия 8

var database = firebase.database();

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

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

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

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

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

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

Веб-версия 9

import { getDatabase, ref, push, set } from "firebase/database";

// Create a new post reference with an auto-generated id
const db = getDatabase();
const postListRef = ref(db, 'posts');
const newPostRef = push(postListRef);
set(newPostRef, {
    // ...
});

Веб-версия 8

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

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

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

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

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

Веб-версия 9

import { getDatabase, ref, onChildAdded, onChildChanged, onChildRemoved } from "firebase/database";

const db = getDatabase();
const commentsRef = ref(db, 'post-comments/' + postId);
onChildAdded(commentsRef, (data) => {
  addCommentElement(postElement, data.key, data.val().text, data.val().author);
});

onChildChanged(commentsRef, (data) => {
  setCommentValues(postElement, data.key, data.val().text, data.val().author);
});

onChildRemoved(commentsRef, (data) => {
  deleteComment(postElement, data.key);
});

Веб-версия 8

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

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

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

Прислушивайтесь к ценностным событиям

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

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

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

Веб-версия 9

import { getDatabase, ref, onValue } from "firebase/database";

const db = getDatabase();
const dbRef = ref(db, '/a/b/c');

onValue(dbRef, (snapshot) => {
  snapshot.forEach((childSnapshot) => {
    const childKey = childSnapshot.key;
    const childData = childSnapshot.val();
    // ...
  });
}, {
  onlyOnce: true
});

Веб-версия 8

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

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

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

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

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

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

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

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

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

Веб-версия 9

import { getDatabase, ref, query, orderByChild } from "firebase/database";
import { getAuth } from "firebase/auth";

const db = getDatabase();
const auth = getAuth();

const myUserId = auth.currentUser.uid;
const topUserPostsRef = query(ref(db, 'user-posts/' + myUserId), orderByChild('starCount'));

Веб-версия 8

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() вызове.

Веб-версия 9

import { getDatabase, ref, query, orderByChild } from "firebase/database";

const db = getDatabase();
const mostViewedPosts = query(ref(db, 'posts'), orderByChild('metrics/views'));

Веб-версия 8

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

Для получения более подробной информации о том , как другие типы данных упорядочены см Как запрос данные упорядочены .

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

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

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

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

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

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

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

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

Веб-версия 9

import { getDatabase, ref, query, limitToLast } from "firebase/database";

const db = getDatabase();
const recentPostsRef = query(ref(db, 'posts'), limitToLast(100));

Веб-версия 8

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

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

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

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

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

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

orderByChild

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

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

orderByKey

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

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

orderByValue

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

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

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

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

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

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