1. Omówienie
W tym laboratorium programistycznym zintegrujesz Firebase Data Connect z bazą danych Cloud SQL, aby utworzyć aplikację na Androida do tworzenia recenzji filmów. Poznasz też te sposoby:
- Tworzenie schematu GraphQL dla Firebase Data Connect
- pisać zapytania i mutacje,
- Implementowanie uwierzytelniania użytkowników w celu zabezpieczenia danych
Wymagania wstępne
- najnowsza wersja Android Studio,
- emulator Androida z poziomem interfejsu API 23 lub wyższym,
Czego się nauczysz
- Jak skonfigurować Firebase Data Connect za pomocą emulatorów lokalnych.
- Jak zaprojektować schemat danych za pomocą Data Connect i GraphQL.
- Jak pisać zapytania i mutacje w przypadku aplikacji z recenzjami filmów.
- Jak wygenerować pakiet SDK Kotlin i użyć go w aplikacji na Androida.
- (Opcjonalnie) Jak wdrożyć usługę Data Connect w środowisku produkcyjnym.
2. Konfigurowanie przykładowego projektu
Tworzenie projektu Firebase
- Zaloguj się w konsoli Firebase za pomocą konta Google.
- W konsoli Firebase kliknij Dodaj projekt.
- Wpisz nazwę projektu Firebase (np. „Recenzja filmu”) i kliknij Kontynuuj.
- Możesz otrzymać prośbę o włączenie Google Analytics, ale w ramach tego ćwiczenia nie ma to znaczenia.
- Po około minucie Twój projekt Firebase będzie gotowy. Kliknij Kontynuuj.
Pobieranie kodu
Aby skopiować przykładowy kod do tego ćwiczenia, uruchom to polecenie. Spowoduje to utworzenie na komputerze katalogu o nazwie codelab-dataconnect-android
:
git clone https://github.com/firebaseextended/codelab-dataconnect-android.git
Jeśli nie masz git na komputerze, możesz też pobrać kod bezpośrednio z GitHuba.
Dodawanie konfiguracji Firebase
- W konsoli Firebase kliknij Omówienie projektu w menu nawigacyjnym po lewej stronie. Kliknij przycisk Android, aby wybrać platformę. Gdy pojawi się prośba o podanie nazwy pakietu, wpisz
com.google.firebase.example.dataconnect
. - Kliknij Zarejestruj aplikację i postępuj zgodnie z instrukcjami, aby pobrać plik
google-services.json
i przesunąć go do kataloguapp/
pobranego właśnie kodu. Następnie kliknij Dalej.
3. Konfigurowanie Data Connect
Instalacja
Automatyczna instalacja
W katalogu codelab-dataconnect-android
uruchom to polecenie:
curl -sL https://firebase.tools/dataconnect | bash
Ten skrypt próbuje skonfigurować środowisko programistyczne i uruchomić IDE w przeglądarce. To środowisko IDE udostępnia narzędzia, w tym wstępnie skompilowane rozszerzenie VS Code, które ułatwia zarządzanie schematem i definiowanie zapytań oraz mutacji do użycia w aplikacji, a także generowanie pakietów SDK o ścisłym typowaniu.
Po uruchomieniu skryptu VS Code powinien otworzyć się automatycznie.
Uwaga: jeśli masz już zainstalowaną wersję na komputer VS Code, skrypt powinien otworzyć ją automatycznie. Jeśli skrypt się nie powiedzie, wykonaj podane niżej czynności związane z ręczną instalacją.
Instalacja ręczna
- Zainstaluj Visual Studio Code.
- Zainstaluj Node.js
- W VS Code otwórz katalog
codelab-dataconnect-android
. - Zainstaluj rozszerzenie Firebase Data Connect ze sklepu Visual Studio Code Marketplace.
Inicjowanie usługi Data Connect w projekcie
W panelu po lewej stronie kliknij ikonę Firebase, aby otworzyć interfejs rozszerzenia Data Connect w VS Code:
- Kliknij przycisk Zaloguj się przez Google. Otworzy się okno przeglądarki. Postępuj zgodnie z instrukcjami, aby zalogować się w rozszerzeniu za pomocą konta Google.
- Kliknij przycisk Połącz z projektem Firebase i wybierz projekt utworzony wcześniej w konsoli.
Kliknij przycisk Uruchom init firebase i postępuj zgodnie z instrukcjami wyświetlanymi w zintegrowanym terminalu.
Konfigurowanie generowania pakietu SDK
Po kliknięciu przycisku Uruchom inicjalizację Firebase rozszerzenie Firebase Data Connect powinno zainicjować katalog dataconnect/
.
W VS Code otwórz plik dataconnect/connector/connector.yaml
, aby znaleźć domyślną konfigurację. Aby ułatwić wizualizację generowania kodu w tym ćwiczeniu, zmień wartość parametru connectorId na movies
, a parametr package na com.google.firebase.example.dataconnect.generated
:
connectorId: movies
generate:
kotlinSdk:
outputDir: ../../app/src/main/java
package: com.google.firebase.example.dataconnect.generated
Aby zrozumieć, co oznaczają poszczególne stany:
- connectorId – unikalna nazwa tego łącznika.
- outputDir – ścieżka do katalogu, w którym będzie przechowywany wygenerowany pakiet SDK Data Connect. Ta ścieżka jest względna do katalogu zawierającego plik connector.yaml.
- package – nazwa pakietu, która ma być używana w wygenerowanym pakiecie SDK.
Uruchom emulatory Firebase.
W VS Code kliknij przycisk Uruchom emulatory.
Emulator powinien się uruchomić w zintegrowanym terminalu. Jeśli wszystko się zacznie, powinny pojawić się dane wyjściowe podobne do tych:
Konfigurowanie aplikacji na Androida do korzystania z lokalnego emulatora
- Otwórz Android Studio.
- Na ekranie powitalnym Android Studio kliknij przycisk Otwórz i wybierz katalog
codelab-dataconnect-android
. Zaczekaj na synchronizację Gradle. - Po zakończeniu synchronizacji Gradle otwórz plik
app/src/main/java/com/google/firebase/example/dataconnect/MainActivity.kt
i wywołaj funkcję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. Zdefiniuj schemat i wstępnie wypełnij bazę danych
W tej sekcji określisz w schemacie strukturę i relacje między najważniejszymi elementami w aplikacji filmowej. Elementy takie jak Movie
, User
i Review
są mapowane na tabele bazy danych, a relacje są ustanawiane za pomocą poleceń Firebase Data Connect i direktiw schematu GraphQL.
Podstawowe elementy i powiązania
Typ Movie
zawiera kluczowe informacje, takie jak tytuł, gatunek i tagi, których aplikacja używa do wyszukiwania i profili filmów. Typ User
śledzi interakcje użytkowników, takie jak opinie i ulubione. Review
umożliwia użytkownikom oglądanie filmów, pokazując oceny i opinie użytkowników.
Tabela użytkowników
Typ użytkownika definiuje użytkownika, który wchodzi w interakcję z filmami, pozostawiając opinie lub dodając filmy do ulubionych.
W VS Code otwórz plik dataconnect/schema/schema.gql
i usuń komentarz (lub dodaj) z definicji tabeli 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
}
Tabela Movie
Typ Movie definiuje główną strukturę encji filmu, w tym pola takie jak tytuł, gatunek, rok wydania i ocena.
W VS Code otwórz plik dataconnect/schema/schema.gql
i usuń komentarz (lub dodaj) z definicji tabeli 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
}
Tabela MovieMetadata
Typ MovieMetadata tworzy relację jeden-do-jednego z typem Movie. Zawiera ono dodatkowe dane, takie jak reżyser filmu.
W VS Code otwórz plik dataconnect/schema/schema.gql
i usuń komentarz (lub dodaj) z definicji tabeli 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
}
Tabela opinii
Typ opinii reprezentuje element opinii i łączy typy Użytkownik i Film w relacji wiele do wielu (jeden użytkownik może pozostawić wiele opinii, a każdy film może mieć wiele opinii).
W VS Code otwórz plik dataconnect/schema/schema.gql
i usuń komentarz (lub dodaj) z definicji tabeli 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")
}
Pola i ustawienia domyślne utworzone automatycznie
Schemat używa wyrażeń takich jak @default(expr: "uuidV4()")
do automatycznego generowania unikalnych identyfikatorów i sygnatur czasowych. Na przykład pole identyfikatora w typach Film i Opinia jest automatycznie wypełniane identyfikatorem UUID podczas tworzenia nowego rekordu.
Wstawianie danych testowych
Po zdefiniowaniu schematu możesz wstępnie wypełnić bazę danych testowymi danymi.
- W VS Code otwórz
dataconnect/moviedata_insert.gql
. Upewnij się, że emulatory w rozszerzeniu Firebase Data Connect działają. - U góry pliku powinien pojawić się przycisk Uruchom (lokalnie). Kliknij, aby wstawić do bazy danych dane testowe filmu.
- Sprawdź terminal Data Connect Execution, aby potwierdzić, że dane zostały dodane.
Gdy dane są już dostępne, przejdź do następnego kroku, aby dowiedzieć się, jak tworzyć zapytania w Data Connect.
5. Tworzenie zapytania dotyczącego listy filmów
Zacznij od utworzenia zapytania, które wyświetli listę filmów. W przypadku każdego filmu pobierasz identyfikator, tytuł, adres URL obrazu i gatunek.
Definiowanie zapytania
W VS Code otwórz plik dataconnect/connector/queries.gql
i usuń komentarz (lub dodaj) z zapytania ListMovies
:
query ListMovies @auth(level: PUBLIC) {
movies {
id
title
imageUrl
genre
}
}
Aby przetestować nowe zapytanie, kliknij przycisk Uruchom (lokalnie), aby wykonać zapytanie w lokalnej bazie danych. Lista filmów z bazy danych powinna być wyświetlana w sekcji „Wynik” terminala Data Connect Execution.
Rozmowa nawiązywana z poziomu aplikacji na Androida
Gdy już przetestujesz zapytanie w edytorze Data Connectivity, możesz je dodać do aplikacji.
W Android Studio otwórz plik app/src/main/java/com/google/firebase/example/dataconnect/MoviesScreen.kt
i dodaj ten kod, aby wyświetlić listę filmów w formacie siatki:
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())
}
)
}
}
}
Uruchamianie aplikacji
W Android Studio kliknij przycisk Uruchom, aby uruchomić aplikację w emulatorze Androida.
Po uruchomieniu aplikacji powinien pojawić się ekran podobny do tego:
6. Tworzenie zapytania dotyczącego szczegółów filmu
Teraz, gdy aplikacja może wyświetlać listę filmów, utwórz zapytanie, aby wyświetlić szczegóły każdego filmu.
Definiowanie zapytania
W VS Code otwórz plik dataconnect/connector/queries.gql
i usuń komentarz (lub dodaj) z zapytania 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
}
}
}
}
Rozmowa nawiązywana z poziomu aplikacji na Androida
W Android Studio otwórz plik app/src/main/java/com/google/firebase/example/dataconnect/MovieDetailScreen.kt
i dodaj ten kod:
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,
)
}
}
Uruchamianie aplikacji
W Android Studio kliknij przycisk Uruchom, aby uruchomić aplikację w emulatorze Androida.
7. Tworzenie zapytania typu mutation w celu wstawiania użytkowników
Teraz, gdy aplikacja może wyświetlać dane, możesz dodać nowe dane z aplikacji. Aby zrobić to bezpiecznie, użyj uwierzytelniania Firebase.
W ramach tego ćwiczenia aplikacja używa uwierzytelniania anonimowego do logowania użytkowników, ale aby zwiększyć bezpieczeństwo aplikacji, rozważ użycie innej metody uwierzytelniania, np. uwierzytelniania za pomocą adresu e-mail i hasła lub uwierzytelniania przez federacyjnego dostawcę tożsamości.
Definiowanie mutacji
W VS Code otwórz plik dataconnect/connector/mutations.gql
i usuń komentarz (lub dodaj) z zapytania 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
}
)
}
Rozmowa nawiązywana z poziomu aplikacji na Androida
W Android Studio otwórz plik app/src/main/java/com/google/firebase/example/dataconnect/MainActivity.kt
i wywołaj mutację:
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)
}
}
Uruchamianie aplikacji
W Android Studio kliknij przycisk Uruchom, aby uruchomić aplikację w emulatorze Androida.
8. Gratulacje
Gratulacje! Udało Ci się dodać Firebase Data Connect do aplikacji na Androida.
Znasz już najważniejsze kroki wymagane do konfigurowania Data Connect, tworzenia zapytań i mutacji oraz obsługi uwierzytelniania użytkowników.
Co dalej
- Dowiedz się więcej o cenach.
- Dowiedz się więcej o zabezpieczaniu operacji.
- Wdrażanie w środowisku produkcyjnym (następna sekcja)
- Dowiedz się, jak wyszukiwać wektory o podobnej treści.
Opcjonalnie: wdrożenie w gałęzi produkcyjnej
Do tej pory aplikacja używała tylko emulatorów Firebase. Jeśli chcesz dowiedzieć się, jak wdrożyć tę aplikację w prawdziwym projekcie Firebase, przejdź do następnego kroku.
9. (Opcjonalnie) Wdróż aplikację
Dotychczas ta aplikacja była całkowicie lokalna, a wszystkie dane były przechowywane w Pakiecie emulatorów Firebase. W tej sekcji dowiesz się, jak skonfigurować projekt Firebase, aby aplikacja działała w produkcji.
Włączanie uwierzytelniania Firebase
W konsoli Firebase otwórz sekcję uwierzytelniania i kliknij Rozpocznij. Otwórz kartę Metoda logowania i wybierz opcję logowania anonimowego od dostawców.
Włącz metodę logowania anonimowego i kliknij Zapisz.
Wdrażanie schematu Firebase Data Connect
Ważne: jeśli wdrażasz schemat w swoim projekcie po raz pierwszy, ten proces utworzy instancję Cloud SQL PostgreSQL, co może potrwać około 15 minut. Nie będzie można wdrożyć usługi, dopóki instancja Cloud SQL nie będzie gotowa i zintegrowana z Firebase Data Connect.
- W interfejsie rozszerzenia Firebase Data Connect w VS Code kliknij Wdróż w środowisku produkcyjnym.
- Może być konieczne sprawdzenie zmian w schemacie i zatwierdzenie potencjalnie szkodliwych modyfikacji. Pojawi się prośba o:
- Sprawdzanie zmian schematu za pomocą
firebase dataconnect:sql:diff
- Gdy już to zrobisz, zastosuj zmiany, korzystając z procesu rozpoczętego przez
firebase dataconnect:sql:migrate
- Sprawdzanie zmian schematu za pomocą
Twoja instancja Cloud SQL for PostgreSQL zostanie zaktualizowana o ostateczny wdrożony schemat i dane. Stan możesz sprawdzać w konsoli Firebase.
Aby dodać dane do środowiska produkcyjnego, możesz teraz w panelu Firebase Data Connect kliknąć Uruchom (produkcja), tak jak w przypadku lokalnych emulatorów.