Cómo usar los SDKs de Android generados

Los SDK de cliente de Firebase Data Connect te permiten llamar a tus consultas y mutaciones del servidor directamente desde una app de Firebase. Generas un SDK cliente personalizado en paralelo a medida que diseñas los esquemas, las consultas y las mutaciones que implementas en tu servicio de Data Connect. Luego, integras los métodos de este SDK en tu lógica de cliente.

Como mencionamos en otro lugar, es importante tener en cuenta que el código cliente no envía las consultas ni las mutaciones de Data Connect, y que estas se ejecutan en el servidor. En cambio, cuando se implementan, las operaciones de Data Connect se almacenan en el servidor como Cloud Functions. Esto significa que debes implementar los cambios correspondientes del cliente para evitar que se produzcan errores en los usuarios existentes (por ejemplo, en versiones anteriores de la app).

Es por eso que Data Connect te proporciona un entorno de desarrollador y herramientas que te permiten crear prototipos de tus esquemas, consultas y mutaciones implementados en el servidor. También genera SDKs del cliente automáticamente mientras creas prototipos.

Cuando hayas iterado las actualizaciones de tu servicio y tus apps cliente, las actualizaciones del servidor y del cliente estarán listas para implementarse.

Genera tu SDK de Kotlin

Al igual que con la mayoría de los proyectos de Firebase, el trabajo en el código cliente de Firebase Data Connect se realiza en un directorio de proyecto local. Tanto la extensión de VS Code de Data Connect como la CLI de Firebase son herramientas locales importantes para generar y administrar código de cliente.

Las opciones de generación de SDKs se vinculan a varias entradas del archivo dataconnect.yaml que se generó cuando inicializaste tu proyecto.

Inicializa la generación de SDK

En tu connector.yaml, agrega outputDir, package y (para el SDK web) packageJsonDir.
connectorId: movies
generate:
  kotlinSdk:
    outputDir: ../../../src/main/java/com/myapplication
    package: com.myapplication

Reemplaza outputDir por la ruta de acceso del directorio en el que se colocará el código generado. Esta ruta es relativa al directorio que contiene el archivo connector.yaml. Reemplaza package por la sentencia de paquete de Kotlin que se usará en los archivos generados, o bien omite package para usar un paquete predeterminado.

Actualiza los SDKs mientras creas prototipos

Si estás creando prototipos de forma interactiva con la extensión de VS Code de Data Connect y su emulador de Data Connect, los archivos fuente del SDK se generan y actualizan automáticamente mientras modificas los archivos .gql que definen esquemas, consultas y mutaciones. Esta puede ser una función útil en los flujos de trabajo de (re)carga en caliente.

En otros casos, si usas el emulador de Data Connect desde la CLI de Firebase, puedes establecer un seguimiento de las actualizaciones de .gql y también actualizar automáticamente las fuentes de SDK.

Como alternativa, puedes usar la CLI para volver a generar los SDKs cada vez que se cambien los archivos .gql:

firebase dataconnect:sdk:generate --watch

Genera SDKs para la integración y para las versiones de producción

En algunos casos, como cuando preparas fuentes de proyectos para enviarlas a pruebas de CI, puedes llamar a la CLI de Firebase para realizar una actualización por lotes.

En estos casos, usa firebase dataconnect:sdk:generate.

Configura el código del cliente

Incorpora Data Connect en tu código de cliente

Para configurar tu código de cliente para usar Data Connect y tu SDK generado, primero sigue las instrucciones de configuración estándar de Firebase.

Luego, agrega lo siguiente a la sección plugins en app/build.gradle.kts:

// The Firebase team tests with version 1.8.22; however, other 1.8 versions,
// and all newer versions are expected work too.
kotlin("plugin.serialization") version "1.8.22" // MUST match the version of the Kotlin compiler

Luego, agrega lo siguiente a la sección dependencies en app/build.gradle.kts:

implementation("com.google.firebase:firebase-dataconnect:16.0.0-beta01")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1")
implementation("com.google.firebase:firebase-auth:23.1.0") // Optional
implementation("com.google.firebase:firebase-appcheck:18.0.0") // Optional

Inicializa el SDK de Android de Data Connect

Inicializa tu instancia de Data Connect con la información que usaste para configurar Data Connect (todo está disponible en la pestaña Data Connect de la consola de Firebase).

El objeto ConnectorConfig

El SDK requiere un objeto de configuración del conector.

Este objeto se genera automáticamente a partir de serviceId y location en dataconnect.yaml, y connectorId en connector.yaml.

Cómo obtener una instancia de conector

Ahora que configuraste un objeto de configuración, obtén una instancia del conector Data Connect. El emulador de Data Connect generará el código de tu conector. Si el nombre de tu conector es movies y el paquete de Kotlin es com.myapplication, como se especifica en connector.yaml, llama a lo siguiente para recuperar el objeto del conector:

val connector = com.myapplication.MoviesConnector.instance

Ejecuta consultas y mutaciones

Con el objeto conector, puedes ejecutar consultas y mutaciones como se define en el código fuente de GraphQL. Supongamos que tu conector tiene definidas estas operaciones:

mutation createMovie($title: String!, $releaseYear: Int!, $genre: String!, $rating: Int!) {
  movie_insert(data: {
    title: $title
    releaseYear: $releaseYear
    genre: $genre
    rating: $rating
  })
}

query getMovieByKey($key: Movie_Key!) {
  movie(key: $key) { id title }
}

query listMoviesByGenre($genre: String!) {
  movies(where: {genre: {eq: $genre}}) {
    id
    title
  }
}

Luego, puedes crear y recuperar una película de la siguiente manera:

val connector = MoviesConnector.instance

val addMovieResult1 = connector.createMovie.execute(
  title = "Empire Strikes Back",
  releaseYear = 1980,
  genre = "Sci-Fi",
  rating = 5
)

val movie1 = connector.getMovieByKey.execute(addMovieResult1.data.key)

println("Empire Strikes Back: ${movie1.data.movie}")

También puedes recuperar varias películas:

val connector = MoviesConnector.instance

val addMovieResult2 = connector.createMovie.execute(
  title="Attack of the Clones",
  releaseYear = 2002,
  genre = "Sci-Fi",
  rating = 5
)

val listMoviesResult = connector.listMoviesByGenre.execute(genre = "Sci-Fi")

println(listMoviesResult.data.movies)

También puedes recopilar un Flow que solo producirá un resultado cuando se recupere un resultado de consulta nuevo con una llamada al método execute() de la consulta.

val connector = MoviesConnector.instance

connector.listMoviesByGenre.flow(genre = "Sci-Fi").collect { data ->
  println(data.movies)
}

connector.createMovie.execute(
  title="A New Hope",
  releaseYear = 1977,
  genre = "Sci-Fi",
  rating = 5
)

connector.listMoviesByGenre.execute(genre = "Sci-Fi") // will cause the Flow to get notified

Crea prototipos y prueba tu aplicación para Android

Instrumenta clientes para usar un emulador local

Puedes usar el emulador de Data Connect, ya sea desde la extensión de VS Code de Data Connect o desde la CLI.

La instrumentación de la app para conectarse al emulador es la misma para ambas situaciones.

val connector = MoviesConnector.instance

// Connect to the emulator on "10.0.2.2:9399"
connector.dataConnect.useEmulator()

// (alternatively) if you're running your emulator on non-default port:
connector.dataConnect.useEmulator(port = 9999)

// Make calls from your app

Para cambiar a los recursos de producción, comenta las líneas para conectarte al emulador.

Tipos de datos en los SDK de Data Connect

El servidor Data Connect representa tipos de datos de GraphQL comunes y personalizados. Estos se representan en el SDK de la siguiente manera.

Tipo de conexión de datos Kotlin
String String
Int Int (32 bits)
Número de punto flotante Doble (número de punto flotante de 64 bits)
Booleano Booleano
UUID java.util.UUID
Fecha java.util.Date
Marca de tiempo com.google.firebase.Timestamp
Int64 Long
Cualquiera com.google.firebase.dataconnect.AnyValue