Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Начало работы с Cloud Firestore на Android

by
Length:MediumLanguages:

Russian (Pусский) translation by Anna k.Ivanova (you can also view the original English article)

Cloud Firestore - последнее дополнение к семейству продуктов Firebase. Хотя он все еще находится в стадии бета-тестирования, он уже представлен Google как более гибкая и многофункциональная альтернатива базе данных Firebase Realtime.

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

Cloud Firestore, будучи более похожим на документы, ориентированные на базы данных, такие как MongoDB и CouchDB, не имеет таких проблем. Кроме того, он поставляется с большим количеством очень удобных функций, таких как поддержка пакетных операций, атомарных записей и индексированных запросов.

В этом уроке я помогу вам начать использовать Cloud Firestore на платформе Android.

Предпосылки

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

  • последняя версия Android Studio
  • аккаунт Firebase
  • и устройство или эмулятор под управлением Android 4.4 или выше

1. Создание проекта Firebase

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

Welcome screen of Firebase console

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

Add a project dialog

Как только проект будет создан, вы можете установить Firestore в качестве своей базы данных, перейдя в раздел Разработка> База данных и нажав кнопку Попробуйте Firestore Beta.

Database selection page

На следующем экране убедитесь, что вы выбрали опцию Запуск в тестовом режиме и нажмите кнопку Включить.

Firestore security configuration page

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

Empty Firestore database

2. Настройка Android-проекта

Ваш проект Android Studio ничего не знает о проекте Firebase, который вы создали на предыдущем шаге. Самый простой способ установить связь между ними - использовать Firebase Assistant от Android Studio.

Откройте Инструменты> Firebase, чтобы открыть помощника.

Firebase Assistant window

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

Начните, нажав ссылку Зарегистрировать событие Google Analytics в разделе Аналитика и нажав кнопку Подключиться к Firebase. Должно появиться новое окно браузера, спрашивающее вас, хотите ли вы разрешить Android Studio, помимо прочего, управлять данными Firebase.

Android Studio requesting permissions

Нажмите кнопку Разрешить, чтобы продолжить.

Вернитесь в Android Studio, в появившемся диалоговом окне выберите вариант Выбрать существующий Firebase или Google проект, выберите проект Firebase, который вы создали ранее, и нажмите кнопку Подключиться к Firebase.

Connect to Firebase dialog

Затем нажмите Добавить Google Analytics в приложение, чтобы добавить базовые зависимости Firebase к вашему проекту.

Наконец, чтобы добавить Firestore в качестве implementation зависимости, добавьте следующую строку в файл build.gradle модуля app:

Не забудьте нажать кнопку Синхронизировать сейчас, чтобы завершить настройку. Если вы столкнулись с любыми конфликтами версий во время процесса синхронизации, убедитесь, что версии зависимостей Firestore и зависимости Firebase Core идентичны и повторите попытку.

3. Понимание документов и коллекций

Firestore - это база данных NoSQL, которая позволяет хранить данные в виде JSON-подобных документов. Однако сохраненный на нем документ не может существовать независимо. Он всегда должен принадлежать коллекции. Как следует из названия, коллекция представляет собой не что иное, как кучу документов.

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

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

4. Создание документов

Чтобы иметь возможность писать в базу данных Firestore из вашего приложения Android, вы должны сначала получить ссылку на нее, вызвав метод getInstance() класса FirebaseFirestore.

Затем вы должны либо создать новую коллекцию, либо получить ссылку на существующую коллекцию, вызвав метод collection(). Например, в пустой базе данных следующий код создает новую коллекцию с именем solar_system:

Когда у вас есть ссылка на коллекцию, вы можете начать добавлять к ней документы, вызвав метод add(), который ожидает, что карта станет ее аргументом.

Метод add() автоматически генерирует и присваивает уникальный буквенно-цифровой идентификатор каждому документу, который он создает. Если вы хотите, чтобы в ваших документах были свои собственные пользовательские идентификаторы, вы должны сначала вручную создать эти документы, вызвав метод document(), который в свою очередь принимает уникальную строку идентификатора. Затем вы можете заполнить документы, вызвав метод set(), который, как и метод add, ожидает, что карта будет единственным аргументом.

Например, следующий код создает и заполняет новый документ PLANET_EARTH:

Если вы перейдете на консоль Firebase и посмотрите содержимое базы данных, вы сможете легко определить пользовательский идентификатор.

New entries in the Firestore database

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

5. Создание подколлекций

Поддержка подколлекций - одна из самых мощных функций Firestore, и это делает ее заметно отличной от базы данных Firebase Realtime. Используя подколлекции, вы можете не только легко добавлять вложенные структуры в свои данные, но также быть уверенными, что ваши запросы будут потреблять минимальные ресурсы.

Создание подколлекции очень похоже на создание коллекции. Все, что вам нужно сделать, это вызвать метод collection() на объекте DocumentReference и передать ему строку, которая будет использоваться как имя подколлекции.

Например, следующий код создает подколлекцию с названием satellites, и связывает ее с документом PLANET_EARTH:

Если у вас есть ссылка на подколлекцию, вы можете вызвать методы add() или set() для добавления к нему документов.

После запуска вышеуказанного кода документ PLANET_EARTH будет выглядеть следующим образом в консоли Firebase:

Subcollection of a document

6. Выполнение запросов

Выполнить операцию чтения в вашей базе данных Firestore очень просто, если вы знаете идентификатор документа, который хотите прочитать. Почему? Потому что вы можете напрямую получить ссылку на документ, вызвав методы collection() и document(). Например, вот как вы можете получить ссылку на документ PLANET_EARTH, принадлежащий коллекции solar_system:

Чтобы прочитать содержимое документа, вы должны вызвать асинхронный метод get(), который возвращает Task. Добавив к нему OnSuccessListener, вы можете получать уведомления, когда операция чтения завершается успешно.

Результатом операции чтения является объект DocumentSnapshot, содержащий пары ключ-значение, присутствующие в документе. Используя метод get(), вы можете получить значение любого действительного ключа. В следующем примере показано, как это сделать:

Если вы не знаете идентификатор документа, который хотите прочитать, вам придется запустить традиционный запрос для всей коллекции. API Firestore предоставляет интуитивно названные методы фильтрации, такие как whereEqualTo(), whereLessThan() и whereGreaterThan(). Поскольку методы фильтра могут возвращать несколько документов в качестве их результатов, вам понадобится цикл внутри вашего OnSuccessListener для обработки каждого результата.

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

Наконец, если вам интересно прочитать все документы, принадлежащие коллекции, вы можете напрямую вызвать в коллекции метод get(). Например, вот как вы можете перечислить все планеты, присутствующие в коллекции solar_system:

Обратите внимание, что по умолчанию нет определенного порядка, в котором возвращаются результаты. Если вы хотите заказать их на основе ключа, присутствующего во всех результатах, вы можете использовать метод orderBy(). Следующий код заказывает результаты, основанные на значении ключа number:

7. Удаление данных

Чтобы удалить документ с известным идентификатором, все, что вам нужно сделать, это получить ссылку на него, а затем вызвать метод delete().

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

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

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

Чтобы создать новую партию, вы должны вызвать метод batch() вашей базы данных, который возвращает экземпляр класса WriteBatch. Затем вы можете просмотреть все результаты запроса и пометить их для удаления, передав их методу delete() объекта WriteBatch. Наконец, чтобы начать процесс удаления, вы можете вызвать метод commit(). В следующем коде показано, как:

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

Заключение

В этом вводном учебнике вы узнали, как выполнять операции чтения и записи в Google Cloud Firestore. Я предлагаю вам сразу начать использовать его в ваших проектах Android. Есть хороший шанс, что он заменит базу данных Realtime в будущем. Фактически, Google уже говорит, что к моменту выхода бета-версии он будет намного более надежным и масштабируемым, чем база данных Realtime.

Чтобы узнать больше о Cloud Firestore, вы можете обратиться к официальной документации.

И пока вы здесь, ознакомьтесь с некоторыми из наших других руководств по разработке Firebase и Android!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.