1. Обзор

В этом практическом занятии вы интегрируете Firebase Data Connect с базой данных Cloud SQL для создания Android-приложения для обзоров фильмов. Вы узнаете, как:
- Напишите схему GraphQL для Firebase Data Connect.
- Пишите запросы и мутации.
- Внедрите аутентификацию пользователей для защиты ваших данных.
Предварительные требования
- Последняя версия Android Studio
- Эмулятор Android с API уровня 23 или выше
Что вы узнаете
- Как настроить Firebase Data Connect с помощью локальных эмуляторов.
- Как разработать схему данных с использованием Data Connect и GraphQL.
- Как писать запросы и мутации для приложения, публикующего отзывы о фильмах.
- Как сгенерировать SDK Kotlin и использовать его в Android-приложении.
- (Необязательно) Как развернуть службу Data Connect в рабочей среде.
2. Настройте тестовый проект.
Создайте проект Firebase.
- Войдите в консоль Firebase, используя свою учетную запись Google.
- Нажмите кнопку, чтобы создать новый проект, а затем введите название проекта (например,
Movie Review»). - Нажмите «Продолжить» .
- Если появится запрос, ознакомьтесь с условиями использования Firebase и примите их, после чего нажмите «Продолжить» .
- (Необязательно) Включите помощь ИИ в консоли Firebase (в Firebase она называется "Gemini").
- Для этого практического занятия вам не понадобится Google Analytics, поэтому отключите эту опцию.
- Нажмите «Создать проект» , дождитесь завершения подготовки проекта, а затем нажмите «Продолжить» .
Скачать код
Выполните следующую команду, чтобы клонировать пример кода для этого практического занятия. В результате на вашем компьютере будет создана директория с именем codelab-dataconnect-android :
git clone https://github.com/firebaseextended/codelab-dataconnect-android.git
Если у вас нет Git на компьютере, вы также можете загрузить код напрямую с GitHub.
Добавить конфигурацию Firebase
- В консоли Firebase выберите «Обзор проекта» в левой панели навигации. Нажмите кнопку Android, чтобы выбрать платформу. При запросе имени пакета используйте
com.google.firebase.example.dataconnect - Нажмите «Зарегистрировать приложение» и следуйте инструкциям, чтобы загрузить файл
google-services.jsonи переместить его в каталогapp/загруженного вами кода. Затем нажмите «Далее».
3. Настройка подключения к данным
Установка
Автоматическая установка
Выполните следующую команду в каталоге codelab-dataconnect-android :
curl -sL https://firebase.tools/dataconnect | bash
Этот скрипт пытается настроить для вас среду разработки и запустить браузерную IDE. Эта IDE предоставляет инструменты, включая предварительно установленное расширение VS Code, которые помогут вам управлять схемой, определять запросы и мутации для использования в вашем приложении, а также генерировать строго типизированные SDK.
После запуска скрипта VS Code должен открыться автоматически.
Примечание: Если у вас уже установлена настольная версия VS Code, скрипт должен открыть её автоматически. Если скрипт не сработает, воспользуйтесь описанными ниже шагами по ручной установке.
Ручная установка
- Установите Visual Studio Code.
- Установите Node.js
- В VS Code откройте каталог
codelab-dataconnect-android. - Установите расширение Firebase Data Connect из магазина расширений Visual Studio Code .
Инициализируйте подключение к данным в проекте.
В левой панели щелкните значок Firebase, чтобы открыть пользовательский интерфейс расширения Data Connect для VS Code:
- Нажмите кнопку « Войти через Google» . Откроется окно браузера; следуйте инструкциям, чтобы войти в расширение с помощью своей учетной записи Google.

- Нажмите кнопку «Подключить проект Firebase» и выберите проект, созданный ранее в консоли.

Нажмите кнопку «Запустить firebase init» и следуйте инструкциям во встроенном терминале.
Настройка генерации SDK
После нажатия кнопки «Запустить инициализацию Firebase» расширение Firebase Data Connect инициализирует для вас каталог dataconnect/ .
В VS Code откройте файл dataconnect/connector/connector.yaml , и вы найдете конфигурацию по умолчанию. Чтобы упростить визуализацию генерации кода в этом практическом занятии, измените connectorId на movies , а package на com.google.firebase.example.dataconnect.generated :
connectorId: movies
generate:
kotlinSdk:
outputDir: ../../app/src/main/java
package: com.google.firebase.example.dataconnect.generated
Чтобы понять, что означает каждый из этих пунктов:
- connectorId — уникальное имя для этого коннектора.
- outputDir — путь, куда будет сохранен сгенерированный SDK Data Connect. Этот путь является относительным к каталогу, содержащему файл connector.yaml.
- package — имя пакета, которое будет использоваться в сгенерированном SDK.
Запустите эмуляторы Firebase
В VS Code нажмите кнопку «Запустить эмуляторы» .

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

Настройте Android-приложение для использования локального эмулятора.
- Откройте Android Studio.
- На экране приветствия Android Studio нажмите кнопку «Открыть» и выберите каталог
codelab-dataconnect-android. Дождитесь синхронизации Gradle. - После завершения синхронизации Gradle откройте файл
app/src/main/java/com/google/firebase/example/dataconnect/MainActivity.ktи вызовитеuseEmulator():
import com.google.firebase.example.dataconnect.generated.MoviesConnector
import com.google.firebase.example.dataconnect.generated.instance
class MainActivity : ComponentActivity() {
...
// Initialize Firebase Data Connect
MoviesConnector.instance.dataConnect.useEmulator("10.0.2.2", 9399)
...
}
4. Определите схему и предварительно заполните базу данных.
В этом разделе вы определите структуру и взаимосвязи между ключевыми сущностями в приложении для просмотра фильмов в схеме. Такие сущности, как Movie , User и Review , сопоставляются с таблицами базы данных, а взаимосвязи устанавливаются с помощью Firebase Data Connect и директив схемы GraphQL.
Основные сущности и взаимоотношения
Тип Movie содержит ключевые сведения, такие как название, жанр и теги, которые приложение использует для поиска и создания профилей фильмов. Тип User отслеживает взаимодействия пользователей, например, отзывы и добавление в избранное. Review связывает пользователей с фильмами, позволяя приложению отображать пользовательские оценки и отзывы.
Таблица пользователей
Тип «Пользователь» определяет сущность пользователя, который взаимодействует с фильмами, оставляя отзывы или добавляя фильмы в избранное.
В VS Code откройте файл dataconnect/schema/schema.gql и раскомментируйте (или добавьте) определение таблицы User :
# Users
# Suppose a user can leave reviews for movies
# user -> reviews is a one to many relationship,
# movie -> reviews is a one to many relationship
# movie <-> user is a many to many relationship
type User @table {
id: String! @col(name: "user_auth")
username: String! @col(name: "username", dataType: "varchar(50)")
# The following are generated by the user: User! field in the Review table
# reviews_on_user
# movies_via_Review
}
Киностол
Тип «Фильм» определяет основную структуру объекта «Фильм», включая такие поля, как название, жанр, год выпуска и рейтинг.
В VS Code откройте файл dataconnect/schema/schema.gql и раскомментируйте (или добавьте) определение таблицы Movie :
# Movies
type Movie @table {
# The below parameter values are generated by default with @table, and can be edited manually.
# implies directive `@col(name: "movie_id")`, generating a column name
id: UUID! @default(expr: "uuidV4()")
title: String!
imageUrl: String!
genre: String
}
Таблица метаданных фильмов
Тип MovieMetadata устанавливает однозначное соответствие с типом Movie. Он включает дополнительные данные, такие как режиссер фильма.
В VS Code откройте файл dataconnect/schema/schema.gql и раскомментируйте (или добавьте) определение таблицы MovieMetadata :
# Movie - MovieMetadata is a one-to-one relationship
type MovieMetadata @table {
# @unique indicates a 1-1 relationship
movie: Movie! @unique
# movieId: UUID <- this is created by the above reference
rating: Float
releaseYear: Int
description: String
}
Таблица обзора
Тип «Отзыв» представляет собой сущность отзыва и связывает типы «Пользователь» и «Фильм» в отношении «многие ко многим» (один пользователь может оставить много отзывов, и у каждого фильма может быть много отзывов).
В VS Code откройте файл dataconnect/schema/schema.gql и раскомментируйте (или добавьте) определение таблицы Review :
# Reviews
type Review @table(name: "Reviews", key: ["movie", "user"]) {
id: UUID! @default(expr: "uuidV4()")
user: User!
movie: Movie!
rating: Int
reviewText: String
reviewDate: Date! @default(expr: "request.time")
}
Автоматически генерируемые поля и значения по умолчанию
Схема использует выражения типа @default(expr: "uuidV4()") для автоматической генерации уникальных идентификаторов и временных меток. Например, поле id в типах «Фильм» и «Отзыв» автоматически заполняется UUID при создании новой записи.
Вставьте фиктивные данные
После определения схемы вы можете предварительно заполнить базу данных тестовыми данными для проверки.
- В VS Code откройте
dataconnect/moviedata_insert.gql. Убедитесь, что эмуляторы в расширении Firebase Data Connect запущены. - В верхней части файла вы должны увидеть кнопку «Запустить (локально)». Нажмите на неё, чтобы вставить данные фиктивного фильма в вашу базу данных.

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

После того, как данные будут подготовлены, перейдите к следующему шагу, чтобы узнать, как создавать запросы в Data Connect.
5. Создайте запрос для вывода списка фильмов.
Для начала создайте запрос для получения списка фильмов. Для каждого фильма вам потребуется получить идентификатор, название, imageUrl и жанр.
Определите запрос
В VS Code откройте файл dataconnect/connector/queries.gql и раскомментируйте (или добавьте) запрос ListMovies :
query ListMovies @auth(level: PUBLIC) {
movies {
id
title
imageUrl
genre
}
}
Чтобы протестировать новый запрос, нажмите кнопку «Выполнить (локально)», чтобы выполнить запрос к вашей локальной базе данных. Список фильмов из базы данных должен отобразиться в разделе «Результат» терминала выполнения запроса Data Connect.

Вызовите его из приложения для Android.
Теперь, когда вы протестировали запрос в эмуляторе Data Connect, пришло время добавить его в приложение.
В Android Studio откройте файл app/src/main/java/com/google/firebase/example/dataconnect/MoviesScreen.kt и добавьте следующий код для отображения списка фильмов в виде сетки:
import com.google.firebase.example.dataconnect.generated.ListMoviesQuery
import com.google.firebase.example.dataconnect.generated.MoviesConnector
import com.google.firebase.example.dataconnect.generated.execute
import com.google.firebase.example.dataconnect.generated.instance
@Composable
fun MoviesScreen(
onMovieClicked: (id: String) -> Unit
) {
var movies by remember { mutableStateOf(emptyList<ListMoviesQuery.Data.MoviesItem>()) }
LaunchedEffect(Unit) {
// Queries need to be executed in a coroutine context
try {
movies = MoviesConnector.instance.listMovies.execute().data.movies
} catch (e: Exception) {
// Will be done at a later step
}
}
LazyVerticalGrid(GridCells.Adaptive(150.dp)) {
items(movies) { movie ->
MovieCard(
movieId = movie.id.toString(),
movieTitle = movie.title,
movieImageUrl = movie.imageUrl,
movieGenre = movie.genre,
onMovieClicked = {
onMovieClicked(movie.id.toString())
}
)
}
}
}
Запустите приложение
В Android Studio нажмите кнопку «Запустить», чтобы запустить приложение в эмуляторе Android.
После запуска приложения вы увидите экран, который выглядит примерно так:

6. Создайте запрос с подробными сведениями о фильме.
Теперь, когда приложение может отображать список фильмов, давайте создадим запрос для вывода подробной информации о каждом фильме.
Определите запрос
В VS Code откройте файл dataconnect/connector/queries.gql и раскомментируйте (или добавьте) запрос GetMovieById :
# Get movie by id
query GetMovieById($id: UUID!) @auth(level: PUBLIC) {
movie(id: $id) {
id
title
imageUrl
genre
metadata: movieMetadata_on_movie {
rating
releaseYear
description
}
reviews: reviews_on_movie {
id
reviewText
reviewDate
rating
user {
id
username
}
}
}
}
Вызовите его из приложения для Android.
В Android Studio откройте файл app/src/main/java/com/google/firebase/example/dataconnect/MovieDetailScreen.kt и добавьте следующий код:
importcom.google.firebase.example.dataconnect.generated.GetMovieByIdQuery
importcom.google.firebase.example.dataconnect.generated.MoviesConnector
importcom.google.firebase.example.dataconnect.generated.execute
importcom.google.firebase.example.dataconnect.generated.instance
@Composable
fun MovieDetailScreen(
movieId: String
) {
var movie by remember { mutableStateOf<GetMovieByIdQuery.Data.Movie?>(null) }
LaunchedEffect(Unit) {
movie = MoviesConnector.instance.getMovieById.execute(
UUID.fromString(movieId)
).data.movie
}
if (movie == null) {
LoadingScreen()
} else {
MovieDetails(
movieTitle = movie!!.title,
movieImageUrl = movie!!.imageUrl,
movieGenre = movie!!.genre,
movieRating = movie!!.metadata?.rating,
movieReleaseYear = movie!!.metadata?.releaseYear,
movieDescription = movie!!.metadata?.description,
)
}
}
Запустите приложение
В Android Studio нажмите кнопку «Запустить», чтобы запустить приложение в эмуляторе Android.
7. Создайте мутацию для добавления пользователей.
Теперь, когда приложение может отображать данные, пришло время добавить новые данные из приложения. Для безопасного выполнения этой задачи следует использовать аутентификацию Firebase.
В рамках данного практического занятия приложение использует анонимную аутентификацию для входа пользователей, но для повышения безопасности приложения рекомендуется использовать другой метод аутентификации, например, аутентификацию по электронной почте/паролю или федеративный поставщик идентификации.
Определите мутацию
В VS Code откройте файл dataconnect/connector/mutations.gql и раскомментируйте (или добавьте) запрос UpsertUser :
# Upsert (update or insert) a user's username based on their auth.uid
mutation UpsertUser($username: String!) @auth(level: USER) {
user_upsert(
data: {
id_expr: "auth.uid"
username: $username
}
)
}
Вызовите его из приложения для Android.
В Android Studio откройте файл app/src/main/java/com/google/firebase/example/dataconnect/MainActivity.kt и вызовите мутацию:
import com.google.firebase.example.dataconnect.generated.execute
LaunchedEffect(Unit) {
// If there's no user signed in, sign in an anonymous user
if (firebaseAuth.currentUser == null) {
firebaseAuth.signInAnonymously().await()
val newUsername = getRandomUsername()
MoviesConnector.instance.upsertUser.execute(newUsername)
}
}
Запустите приложение
В Android Studio нажмите кнопку «Запустить», чтобы запустить приложение в эмуляторе Android.
8. Поздравляем!
Поздравляем, вы успешно добавили Firebase Data Connect в Android-приложение!
Теперь вы знаете основные шаги, необходимые для настройки Data Connect, создания запросов и мутаций, а также обработки аутентификации пользователей.
Что дальше?
- Узнайте больше о ценах
- Узнайте больше об обеспечении безопасности операций.
- Развертывание в производственной среде (следующий раздел)
- Узнайте, как выполнять поиск векторного сходства.
Необязательно: развернуть в продакшене
На данный момент это приложение использует только эмуляторы Firebase. Если вы хотите узнать, как развернуть это приложение в реальном проекте Firebase, перейдите к следующему шагу.
9. (Необязательно) Разверните ваше приложение
До сих пор это приложение работало полностью локально, все данные хранились в Firebase Emulator Suite. В этом разделе вы узнаете, как настроить ваш проект Firebase, чтобы это приложение работало в продакшене.
Включить аутентификацию Firebase
В консоли Firebase перейдите в раздел «Аутентификация» и нажмите «Начать». Перейдите на вкладку «Метод входа» и выберите в списке поставщиков услуг вариант «Анонимный вход».
Включите анонимный вход и нажмите «Сохранить».
Разверните схему Firebase Data Connect.
Важно: Если вы впервые развертываете схему в своем проекте, в процессе будет создан экземпляр Cloud SQL PostgreSQL, что может занять около 15 минут. Вы не сможете развернуть схему, пока экземпляр Cloud SQL не будет готов и интегрирован с Firebase Data Connect.
- В пользовательском интерфейсе расширения Firebase Data Connect для VS Code нажмите «Развернуть в продакшене» .
- Вам может потребоваться проверить изменения схемы и утвердить потенциально деструктивные модификации. Вам будет предложено:
- Проверьте изменения схемы с помощью
firebase dataconnect:sql:diff - Когда вы будете удовлетворены внесенными изменениями, примените их, используя процесс, запущенный командой
firebase dataconnect:sql:migrate
- Проверьте изменения схемы с помощью
Ваш экземпляр Cloud SQL for PostgreSQL будет обновлен с использованием окончательно развернутой схемы и данных. Вы можете отслеживать статус в консоли Firebase.
Теперь вы можете нажать кнопку «Запустить (Производственная среда)» на панели Firebase Data Connect, как и в случае с локальными эмуляторами, чтобы добавить данные в производственную среду.