Firebase SQL Connect pakiety SDK klienta umożliwiają wywoływanie zapytań i mutacji po stronie serwera bezpośrednio z aplikacji w Firebase. Podczas projektowania schematów, zapytań i mutacji, które wdrażasz w usłudze SQL Connect równolegle generujesz niestandardowy pakiet SDK klienta. Następnie integrujesz metody z tego pakietu SDK z logiką klienta.
Jak wspomnieliśmy w innym miejscu, ważne jest, aby pamiętać, że SQL Connect zapytania i mutacje nie są przesyłane przez kod klienta i wykonywane na serwerze. Zamiast tego po wdrożeniu operacje SQL Connect są przechowywane na serwerze, tak jak Cloud Functions. Oznacza to, że musisz wdrożyć odpowiednie zmiany po stronie klienta, aby uniknąć problemów u dotychczasowych użytkowników (np. w starszych wersjach aplikacji).
Dlatego SQL Connect udostępnia środowisko programistyczne i narzędzia, które umożliwiają tworzenie prototypów schematów, zapytań i mutacji wdrożonych na serwerze. Podczas tworzenia prototypu automatycznie generuje też pakiety SDK po stronie klienta.
Gdy wprowadzisz iteracyjne aktualizacje usługi i aplikacji klienckich, aktualizacje po stronie serwera i po stronie klienta będą gotowe do wdrożenia.
Jaki jest proces tworzenia klienta?
Jeśli wykonasz czynności opisane w przewodniku Pierwsze kroki, poznasz ogólny proces tworzenia w SQL Connect. W tym przewodniku znajdziesz bardziej szczegółowe informacje o generowaniu pakietów SDK Flutter na podstawie schematu oraz o pracy z zapytaniami i mutacjami klienta.
Podsumowując, aby używać wygenerowanych pakietów SDK Flutter w aplikacjach klienckich, musisz wykonać te czynności przygotowawcze:
- Dodaj Firebase do aplikacji Flutter.
- Zainstaluj interfejs wiersza poleceń flutterfire
dart pub global activate flutterfire_cli. - Uruchom
flutterfire configure.
Następnie:
- Opracuj schemat aplikacji.
Skonfiguruj generowanie pakietu SDK:
- Za pomocą przycisku Dodaj pakiet SDK do aplikacji w rozszerzeniu SQL Connect VS Code.
- Aktualizując plik
connector.yaml.
Skonfiguruj i użyj emulatora SQL Connect oraz przeprowadzaj iteracje.
Wygeneruj pakiet SDK Flutter
Użyj interfejsu wiersza poleceń Firebase, aby skonfigurować wygenerowane pakiety SDK SQL Connect w aplikacjach.
Polecenie init powinno wykryć wszystkie aplikacje w bieżącym folderze i automatycznie zainstalować wygenerowane pakiety SDK.
firebase init dataconnect:sdk
Aktualizowanie pakietów SDK podczas tworzenia prototypu
Jeśli masz zainstalowane rozszerzenie SQL Connect VS Code, będzie ono zawsze aktualizować wygenerowane pakiety SDK.
Jeśli nie używasz rozszerzenia SQL Connect VS Code, możesz użyć wiersza poleceń Firebase, aby aktualizować wygenerowane pakiety SDK.
firebase dataconnect:sdk:generate --watchGenerowanie pakietów SDK w potokach kompilacji
Za pomocą wiersza poleceń Firebase możesz generować pakiety SDK SQL Connect w procesach kompilacji CI/CD.
firebase dataconnect:sdk:generateKonfigurowanie kodu klienta
Inicjowanie aplikacji SQL Connect
Najpierw zainicjuj aplikację, postępując zgodnie z e standardowymi instrukcjami konfiguracji Firebase.
Następnie zainstaluj wtyczkę SQL Connect:
flutter pub add firebase_data_connectInicjowanie pakicetu SDK FlutterSQL Connect
Zainicjuj instancję SQL Connect, używając informacji, których używasz do konfigurowania SQL Connect. Znajdziesz je w Bazy danych i miejsce na dane > SQL Connect na stronie Firebase konsoli.
Importowanie bibliotek
Aby zainicjować kod klienta, musisz zaimportować 2 zestawy bibliotek – ogólne SQL Connect biblioteki oraz konkretne, wygenerowane biblioteki pakietu SDK.
// general imports
import 'package:firebase_data_connect/firebase_data_connect.dart';
// generated queries and mutations from SDK
import 'generated/movies.dart';
Używanie zapytań po stronie klienta
Wygenerowany kod będzie już zawierać predefiniowane odwołania do zapytań. Wystarczy je zaimportować i wywołać na nich polecenie execute.
import 'generated/movies.dart';
await MoviesConnector.instance.listMovies().execute();
Wywoływanie metod zapytań pakietu SDK
Oto przykład użycia tych funkcji skrótów do działań:
import 'generated/movies.dart';
function onBtnClick() {
// This will call the generated Dart from the CLI and then make an HTTP request to the server.
MoviesConnector.instance.listMovies().execute().then(data => showInUI(data)); // == MoviesConnector.instance.listMovies().ref().execute();
}
Pola opcjonalne
Niektóre zapytania mogą mieć pola opcjonalne. W takich przypadkach pakiet SDK Flutter udostępnia metodę tworzenia, którą trzeba ustawić osobno.
Na przykład pole rating jest opcjonalne podczas wywoływania createMovie, więc musisz je podać w funkcji tworzenia.
await MoviesConnector.instance.createMovie( title: 'Empire Strikes Back', releaseYear: 1980, genre: 'Sci-Fi').rating(5).execute();
Subskrybowanie zmian
Zapoznaj się z artykułem Otrzymywanie aktualizacji w czasie rzeczywistym z SQL Connect.
Obsługa zmian w polach wyliczeniowych
Schemat aplikacji może zawierać wyliczenia, do których można uzyskać dostęp za pomocą zapytań GraphQL.
W miarę zmian w projekcie aplikacji możesz dodawać nowe obsługiwane wartości wyliczeniowe. Wyobraź sobie na przykład, że w późniejszym etapie cyklu życia aplikacji zdecydujesz się dodać wartość FULLSCREEN do wyliczenia AspectRatio.
W procesie SQL Connect możesz używać lokalnych narzędzi programistycznych do aktualizowania zapytań i pakietów SDK.
Zanim jednak opublikujesz zaktualizowaną wersję klientów, starsze wdrożone klienty mogą przestać działać.
Przykład odpornej implementacji
Wygenerowany pakiet SDK wymusza obsługę nieznanych wartości. Oznacza to, że kod klienta musi rozpakować obiekt EnumValue do postaci Known lub Unknown.
final result = await MoviesConnector.instance.listMovies().execute();
if (result.data != null && result.data!.isNotEmpty) {
handleEnumValue(result.data![0].aspectratio);
}
void handleEnumValue(EnumValue<AspectRatio> aspectValue) {
if (aspectValue.value != null) {
switch(aspectValue.value!) {
case AspectRatio.ACADEMY:
print('This movie is in Academy aspect');
break;
case AspectRatio.WIDESCREEN:
print('This movie is in Widescreen aspect');
break;
case AspectRatio.ANAMORPHIC:
print('This movie is in Anamorphic aspect');
break;
case AspectRatio.IMAX:
print('This movie is in IMAX aspect');
}
} else {
print('Unknown aspect ratio detected: ${aspectValue.stringValue}');
}
}
Włączanie buforowania po stronie klienta
SQL Connect ma opcjonalną funkcję buforowania po stronie klienta, którą możesz
włączyć, edytując plik connector.yaml. Gdy ta funkcja jest włączona, wygenerowane pakiety SDK klienta będą lokalnie buforować odpowiedzi na zapytania, co może zmniejszyć liczbę zapytań do bazy danych wysyłanych przez aplikację i umożliwić działanie części aplikacji zależnych od bazy danych w przypadku przerwy w dostępie do sieci.
Aby włączyć buforowanie po stronie klienta, dodaj konfigurację buforowania po stronie klienta do konfiguracji oprogramowania sprzęgającego:
generate:
javascriptSdk:
outputDir: ../dart/
package: "dataconnect_generated"
clientCache:
maxAge: 5s
storage: memory
Ta konfiguracja ma 2 parametry, oba opcjonalne:
maxAge: maksymalny wiek buforowanej odpowiedzi, po którym pakiet SDK klienta pobierze nowe wartości. Przykłady: „0”, „30s”, „1h30m”.Domyślna wartość
maxAgeto0, co oznacza, że odpowiedzi są buforowane, ale pakiet SDK klienta zawsze będzie pobierać nowe wartości. Buforowane wartości będą używane tylko wtedy, gdy w przypadkuexecute()określonoCACHE_ONLY, a w przypadkusubscribe()zwrócono wynik początkowy.storage: pakiet SDK klienta można skonfigurować tak, aby buforował odpowiedzi w pamięcipersistentlubmemory. Wyniki buforowane w pamięcipersistentbędą przechowywane po ponownym uruchomieniu aplikacji. W przypadku Androida i iOS domyślnie używana jest pamięćpersistent. W przypadku przeglądarek obsługiwana jest tylko pamięćmemory.
Po zaktualizowaniu konfiguracji buforowania oprogramowania sprzęgającego wygeneruj ponownie pakiety SDK klienta i ponownie skompiluj aplikację. Gdy to zrobisz, execute() i subscribe() będą buforować odpowiedzi i używać buforowanych wartości zgodnie ze skonfigurowanymi zasadami. Zwykle dzieje się to automatycznie, bez żadnych dodatkowych działań z Twojej strony. Pamiętaj jednak o tych kwestiach:
Domyślne działanie
execute()jest takie, jak opisano powyżej: jeśli wynik jest buforowany dla zapytania, a buforowana wartość nie jest starsza niżmaxAge, użyj buforowanej wartości. To domyślne działanie jest nazywane zasadąPREFER_CACHE.Możesz też określić, że poszczególne wywołania
execute()mają zwracać tylko buforowane wartości (CACHE_ONLY) lub bezwarunkowo pobierać nowe wartości z serwera (SERVER_ONLY).await queryRef.execute(fetchPolicy: QueryFetchPolicy.cacheOnly);await queryRef.execute(fetchPolicy: QueryFetchPolicy.serverOnly);Gdy wywołasz
subscribe(), zawsze natychmiast zwróci buforowaną treść, jeśli istnieje, niezależnie od ustawieniamaxAge. Kolejne wywołaniaexecute()będą powiadamiać odbiorców zgodnie ze skonfigurowanym ustawieniemmaxAge.
Używanie mutacji po stronie klienta
Mutacje są dostępne w taki sam sposób jak zapytania.
await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi" }).rating(5).execute();
Tworzenie prototypów i testowanie aplikacji Flutter
Konfigurowanie klientów do korzystania z emulatora lokalnego
Możesz używać emulatora SQL Connect z rozszerzenia SQL Connect VS Code lub z interfejsu wiersza poleceń.
Konfigurowanie aplikacji do łączenia się z emulatorem jest takie samo w obu przypadkach.
import 'package:firebase_data_connect/firebase_data_connect.dart';
import 'generated/movies.dart';
MoviesConnector.instance.dataConnect
.useDataConnectEmulator('127.0.0.1', 9399);
// Make calls from your app
QueryRef<ListMoviesData, void> ref = MoviesConnector.instance.listMovies.ref();
Aby przełączyć się na zasoby produkcyjne, zakomentuj wiersze służące do łączenia się z emulatorem.
Typy danych w pakiecie SDK Dart
Serwer SQL Connect reprezentuje typowe typy danych GraphQL. Są one reprezentowane w pakiecie SDK w ten sposób.
| SQL Connect Typ | Dart |
|---|---|
| Sygnatura czasowa | firebase_data_connect.Timestamp |
| Liczba całkowita (32-bitowa) | int |
| Data | DateTime |
| UUID | ciąg znaków |
| Int64 | int |
| Liczba zmiennoprzecinkowa | double |
| Wartość logiczna | bool |
| Dowolna | firebase_data_connect.AnyValue |