Aplicación de chat sin servidor con Jetpack Compose y Huawei Mobile Services – Parte 2 | de Francesco Stranieri | noviembre 2022

¡Hola gente! Ahora es el momento de flujo de chatdonde tenemos dos tipos de objetos a los informes: mensajes_de_entrada y mensajes_completos.

  • mensajes_de_entrada es el tipo de objeto que creamos solo para enviar mensajes en el chat.
  • Mensajes_completados es la fusión entre ‘Usuario’ y ‘mensajes_de_entrada’ y lo usamos para mostrar mensajes en el chat.

Así que básicamente estamos transmitiendo mensajes_de_entrada al servidor y mostramos mensajes_completos en la aplicación Siempre estamos atentos a nuevos datos mensajes_completos El tipo de objeto cambia en Cloud DB, por lo que cada nuevo cambio obtenemos los nuevos datos en la aplicación.Al igual que la función de nube para los datos del usuario, solo necesitamos inicializar para acceder a los tipos de objetos de Cloud DB desde la aplicación. AGConnectCloudDB Pasar contexto y alguna configuración básica para obtener uno AGConnectInstance Objeto. Este objeto es esencial para crear una instancia de base de datos en la nube. Luego, todo lo que tenemos que hacer es pasar toda la información sobre los tipos de objetos a nuestra instancia de base de datos en la nube, que es una función que ya está incluida en el ObjectTypeInfoHelperObjectTypeInfoHelper Clase que descargamos de la consola del desarrollador.estructura de ejemploDiversión initAGConnectCloudDB(Contexto: contexto,instancia de autenticación: AGConnectAuth) {…si (DBZone == cero) {AGConnectCloudDB.inicializar (contexto)valor agcConnectOptions = AGConnectOptionsBuilder().setRoutePolicy(AGCRoutePolicy.GERMANY).build(contexto)val agConnectInstance = AGConnectInstance.buildInstance(agcConnectOptions)Este.instancia de base de datos = AGConnectCloudDB.getInstance(agConnectInstance,authInstance)this.DBInstance.createObjectType(ObjectTypeInfoHelper.getObjectTypeInfo())abrirZonaNube()}}Finalmente, necesitamos abrir ese Zona de base de datos en la nube donde queremos trabajar. cuando lo abrimos Zona de base de datos en la nube Necesitamos especificar cómo trabajar al administrar la sincronización con SOLO CACHÉ local o con la NUBE y que tipo acceso a la propiedad. Al configurarlo’Persistencia habilitada‘ Queremos una copia de los datos de Cloud DB local. Llamando ‘openCloudDBZone2‘ estamos accediendo a Cloud DB Zone, así que estamos revisando eso Construcción Configuramos de antemano y luego cuando es permitido crear la zona si aún no existe.privado Diversión openCloudZone() {val mConfig = CloudDBZoneConfig(«Chat de demostración»,CloudDBZoneConfig.CloudDBZoneSyncProperty.CLOUDDBZONE_CLOUD_CACHE,CloudDBZoneConfig.CloudDBZoneAccessProperty.CLOUDDBZONE_PUBLIC).usar {PersistenciaEnabled = verdadero}esta.DBInstance.openCloudDBZone2(mConfig,Es correcto).addOnSuccessListener {}.addOnFailureListener {}}

Contenidos

ENVIAR MENSAJE

¡Ahora por fin podemos enviar nuestro primer mensaje! Solo creamos uno mensajes_de_entrada objeto y luego invocar ‘EjecutarUpsert‘ con este objeto. Ponemos un ‘vacío’me gustaría‘, esta es la clave principal porque queremos un valor generado aleatoriamente establecido por el backend.Tenga en cuenta que en este paso no mostraremos el mensaje que enviamos ya que el objeto input_messages solo debe enviarse al servidor.Divertida Enviar mensaje(Texto: Cadena) {val mensaje = Mensaje().aplicar {este.id = «»this.text = textthis.user_id = userIDthis.type = ObjectTypeInfoHelper.MESSAGE_TYPE_STANDARD} enviarMensajeEnLaNube(mensaje)} diversión privada enviarMensajeEnLaNube(mensaje: mensaje) { val upsertTask = this.DBZone!!.EjecutarUpsert(mensaje) upsertTask.addOnSuccessListener { cloudDBZoneResult ->}.addOnFailureListener {}}

BACKEND

Entonces el mensajes_de_entrada Objeto guardado en Cloud DB. Para gestionar la parte backend configuramos un DISPARADOR DE LA BASE DE DATOS EN LA NUBE en este ObjectType que se activó gracias a eventType ‘onUpsert‘. Inicia la función de nube ‘crear mensaje completo‘, eso se las arreglará mensajes_completos Construcción de ObjectType basada en los datos de usuario del usuario que envía el mensaje y el mensaje recién guardado en Cloud DB, generando una ID aleatoria. Una vez que se ha guardado el objeto full_messages, la aplicación espera cambios de mensajes completos notificado y recibe los nuevos datos.Esta vez tenemos los datos del Activadores de base de datos en la nube con el ‘onUpserttipo de evento.Porque necesitamos fusionarlos. mensajes_de_entrada datos junto con el usuario Datos relacionados con el usuario que escribe el mensaje, utilizamos el identificación de usuario Valor contenido en los datos del mensaje para ejecutar una consulta para recuperar los datos del usuario. const cloudDBZoneQuery = clouddb.CloudDBZoneQuery.where(usuario.usuario).igual(«Me gustaría», identificación de usuario);const o = esperar esto.cloudDBZoneClient.Ejecutar consulta(cloudDBZoneQuery);

VOLVER A LA APLICACIÓN

Ahora que hemos guardado esos mensajes_completos Data y hay un nuevo cambio en ese tipo de objeto, se notificará a la aplicación que estaba esperando cambios.Pero, ¿cómo se configura el auricular?solo hacemos un consultaen este caso basado en el ‘Escribe‘ Valor relacionado con el tipo de mensaje que queremos mostrar en el chat. Entonces con la función ‘suscribirseInstantánea‘ Digamos a Cloud DB que siga escuchando los cambios en función de esta consulta y, en este caso, estamos especificando escuchar solo en el lado de la NUBE, por lo que no consideramos el CACHE/almacenamiento local.fun getAllMessages() {valor consulta = CloudDBZoneQuery.where(Mensaje completo::clase.java).equalTo(«tipo»,ObjectTypeInfoHelper.MESSAGE_TYPE_STANDARD).o().equalTo(«tipo»,ObjectTypeInfoHelper.MESSAGE_TYPE_POLL)val queryTask = this.DBZone!!.executeQuery(query,CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_DEFAULT ) queryTask.addOnSuccessListener { instantánea ->processQueryResult(instantánea)this.DBZone!!.subscribeSnapshot(consulta,CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_FROM_CLOUD_ONLY,mSnapshotListener)}.addOnFailureListener {…}}Así que tenemos uno OnSnapshotListener regresar un Instantánea de CloudDBZone como resultado, eso es básicamente un cursor contiene los datos actualizados. Ya que necesitamos establecer una lista en el Componer LazyColumnnecesitamos analizarlo y, por lo tanto, usamos un fechas de vida observado como redactar estado para actualizar la interfaz de usuario a change.var Mensajes: MutableLiveData> = MutableLiveData ()oración privada … valor privado mSnapshotListener = OnSnapshotListener { cloudDBZoneSnapshot, err ->err?.let {Log.w(TAG, «onSnapshot: ${err.message}»)} ?: processQueryResult(cloudDBZoneSnapshot)} … diversión privada procesoConsultaResultado(Instantánea:Instantánea de CloudDBZone) {val lista de mensajes = instantánea.lista()mensajes.postValue(messagesList.sortedBy { it.date_ins })}Consejo adicional: para analizarlos Instantánea de CloudDBZone a MutableListtenemos una función extendida de Kotlin llamada «lista()‘ que solo obtiene el cursor y crea una MutableList.private Fun Instantánea de CloudDBZone.toList() = ejecutar {val cursor = this.snapshotObjectsval list = mutableListOf()intenta {while (cursor.hasNext()) {list.add(cursor.next())}} catch (e: AGConnectCloudDBException) {…} final {this.release()}list}

disfruta de la charla

Como ya se mencionó, MutableLiveData observado como Compose State actualiza la interfaz de usuario en función de LazyColumn mediante la actualización de datos…. val messageValue de cloudDBViewModel.mensajes.observeAsState()Columna perezosa(…) {messagesValue?.let {… }}

Editar/borrar mensajes (EXTRA)

Hay dos características adicionales en el chat: Para editar y Claro Mensajes.

  • Edite un mensaje: solo necesita modificar el mensaje con el mismo mensaje Clave primaria Valor de me gustaríade esta forma se actualizarán sus datos sin crear una nueva ocurrencia.
  • Eliminar un mensaje: se basa en la función Cloud DB ‘ejecutarEliminar‘ sobre mensajes_completos Objeto que queremos eliminar del chat.

En ambos casos, continúa editando y eliminando los datos. mensajes_completos cambiará y así lo comunicarán OnSnapshotListener Creamos previamente con los nuevos datos, por lo que está estrechamente relacionado con el flujo de chat que vimos anteriormente. editar mensaje(Texto: Cadena, mensaje completo: Mensaje completo) { val mensaje = Mensaje().apply {this.id = mensaje completo.idthis.text = textthis.user_id = fullMessage.user_idthis.type = fullMessage.type}…sendMessageOnCloud(mensaje)}divertida borrar mensaje(Mensaje: Mensaje completo) {val deleteTask = this.DBZone!!.ejecutarBorrar(mensaje)deleteTask.addOnSuccessListener {…}.addOnFailureListener {…}}

Deja una respuesta

Tu dirección de correo electrónico no será publicada.