Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Crear una Aplicación de Rastreador de Peso Con Cloud Firestore

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Jean Perez (you can also view the original English article)

Almacenar los datos de su aplicación en la nube es muy importante estos días porque los usuarios tienden a poseer varios dispositivos y quiere sus aplicaciones para ser sincronizado a través de todos ellos. Con Cloud Firestore, un tiempo real NoSQL la base de datos disponible en la plataforma de bases avanzadas, hacerlo es más fácil y más seguro que nunca antes.

En un tutorial anterior, presentó a todas las potentes funciones de que nube Firestore tiene para ofrecer. Hoy, te voy a mostrar cómo utilizar junto con otros productos de bases avanzadas, tales como FirebaseUI Auth y bases avanzadas Analytics, para crear un simple, pero altamente escalable, aplicación de rastreador de peso.

Requisitos Previos

Para seguir este tutorial paso a paso, necesitarás:

  • la última versión de Android Studio
  • una cuenta de Firebase
  • y un dispositivo o emulador Android 5.0 o superior

1. Configuración del Proyecto

Para poder hacer uso de productos de bases avanzadas en su proyecto de estudio Android, necesita el plugin de Google servicios Gradle, un archivo de configuración de Firebase  y algunas dependencias de ejecución. Con el Asistente de bases avanzadas, usted puede conseguirlos muy fácilmente.

Abrir el asistente, vaya a Herramientas > Firebase. A continuación, seleccione la opción Analítica y clic en el Registro de un Evento de Análisis.

Fierbase Assistant panel

Ahora puede presionar el Connect a Firebase botón para conectar su proyecto Android Studio a un nuevo proyecto de bases avanzadas.

Connect to Firebase dialog

Sin embargo, para realmente agregar el plugin y las dependencias de la aplicación, necesitará presionar el Analytics de Añadir a la Aplicación.

La aplicación de rastreador de peso estamos creando hoy va a tener sólo dos funciones: almacenar pesos y mostrar como una lista ordenada en orden cronológico inverso. Por supuesto, utilizaremos Firestore para almacenar los pesos. Para mostrarlos como una lista, sin embargo, usaremos Firestore componentes disponibles en la biblioteca de FirebaseUI. Por lo tanto, agregue la siguiente dependencia de ejecución al archivo de build.gradle del módulo de la aplicación:

Los usuarios deben ser capaces de ver sólo sus propios pesos, no el peso de todo el mundo que utiliza la aplicación. Por lo tanto, nuestra aplicación debe tener la capacidad para identificar sus usuarios. FirebaseUI Auth ofrece esta posibilidad, así que agregamos a continuación la siguiente dependencia:

También se necesitan unos widgets de diseño de Material para darle a nuestra aplicación un aspecto agradable. Así que asegúrese de que agregar la biblioteca de soporte de diseño y de la biblioteca de cuadros de Diálogo de Material como dependencias.

Por último, pulse el botón Sincronizar Ahora para actualizar el proyecto.

2. Configuración de Autenticación de Firebase

Bases avanzadas autenticación soporta una variedad de proveedores de identidad. Sin embargo, todos ellos están deshabilitadas por defecto. Para activar uno o más de ellos, se debe visitar la consola Firebase.

En la consola, seleccione el proyecto de bases avanzadas que creó en el paso anterior, vaya a la sección de autenticación y oprima el botón de Inicio de Sesión Método de Programación.

Firebase Authentication home screen

Para permitir a los usuarios acceder a nuestra aplicación utilizando una cuenta de Google, activar Google como proveedor, dar un nombre significativo de público en el proyecto y presione el botón Guardar.

Google identity provider configuration

Google es el proveedor de identidad más fácil que se puede utilizar. No necesita ninguna configuración, y su proyecto de estudio Android no necesita ninguna dependencia adicional para él.

3. Configuración de Cloud Firestore

Debe habilitar Firestore en la consola de bases avanzadas antes de empezar a utilizarlo. Para ello, vaya a la sección de Base de Datos y pulse el botón Comenzar, presente en la tarjeta de Cloud Firestore Beta.

Cloud Firestore card

Ahora se solicitará seleccionar un modo de seguridad de la base de datos. Asegúrese de que usted elija el Inicio en Modo de Bloqueo y pulse el botón Activar.

Security mode selection screen

En el modo bloqueado, de forma predeterminada, no se podrá acceder o modificar el contenido de la base de datos. Por lo tanto, ahora usted debe crear una regla de seguridad que permite a los usuarios a leer y escribir sólo aquellos documentos que les pertenecen. Iniciar con la apertura de la ficha Reglas.

Antes de crear una regla de seguridad de nuestra base de datos, debemos concretar cómo vamos a almacenar los datos en él. Digamos que vamos a tener una colección de nivel superior denominada usuarios que contiene documentos que representan nuestros usuarios. Los documentos pueden tener identificadores únicos que son idénticos a los ID que genera el servicio de autenticación de bases avanzadas para los usuarios.

Porque los usuarios se agregarán varias entradas de peso a los documentos, utilizando una sub-colección para almacenar esas entradas es ideal. Llamemos a los pesos de sub-colección.

Firestore database structure

Basado en el esquema anterior, ahora podemos crear una regla para la ruta de acceso users/{user_id}/weights/{weight}. La regla es que un usuario puede leer y escribir en la ruta sólo si la variable {user_id} es igual al ID bases avanzadas de autenticación del usuario.

En consecuencia, actualizar el contenido del editor de reglas.

Por último, pulse el botón Publicar para activar la regla.

4. Autenticación de Usuarios

Nuestra aplicación debe ser útil sólo si el usuario es conectado a él mediante una cuenta de Google. Por lo tanto, tan pronto como se abre, se debe comprobar si el usuario tiene una identificación válida de autenticación bases avanzadas Si el usuario tiene el ID, debe seguir adelante y hacer que la interfaz de usuario. De lo contrario, debe mostrar una pantalla de inicio de sesión.

Para comprobar si el usuario tiene un ID, simplemente podemos comprobar que la propiedad currentUser de la clase FirebaseAuth no es null. Si es null, podemos crear una intención de inicio de sesión llamando al método createSignInIntentBuilder() de la clase AuthUI.

El código siguiente muestra cómo hacerlo para Google como proveedor de identidad:

Tenga en cuenta que estamos llamando a un método denominado showUI() si ya existe una identificación válida. Este método no existe todavía, así que crea y deje su cuerpo vacío por ahora.

Para capturar el resultado de la intención de inicio de sesión, debemos reemplazar el método onActivityResult() de la actividad. Dentro del método, si el valor del argumento resultCode RESULT_OK y la propiedad currentUser no es null, significa que el usuario logró ingresar con éxito. En este caso, que llamamos otra vez al método showUI() para representar la interfaz de usuario.

Si el usuario iniciar sesión, podemos mostrar un brindis y cerrar la aplicación llamando al método finish().

Por consiguiente, agregue el código siguiente a la actividad:

En este punto, si se ejecuta la aplicación por primera vez, debería poder ver una pantalla de inicio de sesión que se ve así:

Account selection dialog

En ejecuciones posteriores, gracias a Google Smart Lock, que está habilitado de forma predeterminada, iniciará sesión automáticamente.

5. Definición de Diseños

Nuestra aplicación necesita dos diseños: uno para la actividad principal y otro para las entradas de peso que se mostrará como elementos de la inversa cronológicamente la lista ordenaron.

El diseño de la actividad debe tener un widget de RecyclerView, que actuará como la lista, y un widget de FloatingActionButton, que el usuario puede pulsar para crear una nueva entrada de peso. Después de colocarlos dos dentro de un widget de RelativeLayout, archivo XML de diseño de la actividad debe tener este aspecto:

Nos hemos asociado un controlador de evento de click denominado addWeight() con el widget de FloatingActionButton. El controlador no existe todavía, así que cree un trozo para él dentro de la actividad.

Para mantener el diseño de la entrada de peso simple, vamos a tener dos widgets de TextView dentro de él: uno para mostrar el peso y el otro para mostrar la hora en que fue creada la entrada. Usando un LinearLayout widget como un contenedor para ellos será suficiente.

En consecuencia, crear un nuevo archivo XML de diseño llamado weight_entry.xml y agregue el código siguiente a él:

6. Creación de un Modelo

En el paso anterior, se ha visto que cada entrada de peso tiene un peso y el tiempo asociados a él. Para que Firestore conozcan acerca de esto, debemos crear un modelo para la entrada de peso.

FireStore modelos son datos generalmente simple con las variables miembro necesario.

También es un buen momento para crear un soporte vista para cada entrada de peso. El titular de la vista, como puede haber adivinado, se utilizará por el widget de RecyclerView para representar los elementos de lista. Así que crear una clase nueva denominada WeightEntryVH, que extiende la clase RecyclerView.ViewHolder, y crear a miembro variables para ambos los widgets de TextView. No se olvide de inicializar usando el método findViewById(). El código siguiente muestra cómo hacerlo de manera concisa:

7. Creación de Documentos de Usuario Unico

Cuando un usuario intenta crear una entrada en peso por primera vez, nuestra aplicación debe crear un documento separado para el usuario dentro de la colección de los users en el Firestore. Como hemos decidido antes, la identificación del documento será nada más que la de bases avanzadas autenticación Seudónimo, que puede obtenerse mediante la propiedad uid del objeto currentUser.

Para obtener una referencia a la colección de los users, debemos utilizar el método collection() de la clase FirebaseFirestore. Entonces podemos llamar a su método de document() y pase el uid como argumento para crear documento del usuario.

Necesitamos para acceder a los documentos específicos del usuario tanto durante la lectura y la creación de las entradas de peso. Para evitar la codificación de la lógica anterior dos veces, sugiero que crear un método independiente para él.

Tenga en cuenta que el documento se crea una sola vez por usuario. En otras palabras, varias llamadas al método anterior siempre devolverá el mismo documento, siempre y cuando el usuario utiliza la misma cuenta de Google.

8. Añadir Entradas de Peso

Cuando los usuarios presionan el botón de acción flotante de nuestra aplicación, debe ser capaces de crear nuevas entradas de peso. Para que puedan escribir en sus pesos, debemos ahora crear un cuadro de diálogo que contiene un widget de EditText. Con la biblioteca de cuadro de diálogo Material, hacerlo es extremadamente intuitivo.

Dentro del método addWeight(), que sirve como el controlador de eventos de clic del botón, crear una instancia de MaterialDialog.Builder y llamar a sus métodos title() y content() para dar su diálogo un título y un mensaje significativo. Asimismo, llame al método inputType() y pasar TYPE_CLASS_NUMBER como argumento a para asegurarse de que el usuario puede escribir solamente números en el cuadro de diálogo.

A continuación, llame al método input() para especificar una pista y asociar un controlador de eventos con el cuadro de diálogo. El controlador recibe el peso el usuario escribió en como argumento.

Por último, asegúrese de que llamar al método show() para mostrar el cuadro de diálogo.

Dentro del controlador de eventos, ahora debemos agregar código para realmente crear y rellenar un documento nuevo de entrada de peso. Porque el documento debe pertenecer a la colección de pesas de documento único del usuario, para acceder a la colección, usted debe llamar al método collection() del documento que es devuelto por el método de getUserDocument().

Una vez que la colección, puede llamar a su método add() y pasar a una nueva instancia de la clase WeightEntry que para almacenar la entrada.

En el código anterior, vemos que estamos utilizando la propiedad de tiempo de la clase Date para asociar una marca de tiempo de la entrada.

Si ahora ejecuta la aplicación, debe ser capaz de añadir nuevas entradas de peso a Firestore. No ves la aplicación todavía, pero será visibles en la consola de bases avanzadas.

Add weight dialog

9. Visualización de las Entradas de Peso

Ahora es tiempo para rellenar el widget de RecyclerView de nuestro diseño. Así que empieza por crear una referencia para él utilizando el método findViewById() y asignar una nueva instancia de la clase LinearLayoutManager. Esto debe hacerse dentro del método showUI() que creamos anteriormente.

El widget de RecyclerView debe exhibir todos los documentos que se presentan dentro de la colección de pesos de documento del usuario. Además, los últimos documentos deben aparecer en primer lugar. Para cumplir estos requisitos, ahora debemos crear una consulta llamando a los métodos collection() y orderBy().

Aras de la eficiencia, puede limitar el número de valores devueltos por la consulta llamando al método limitPage().

El código siguiente crea una consulta que devuelve las últimas entradas de 90 peso creadas por el usuario:

Mediante la consulta, ahora debemos crear un objeto FirestoreRecyclerOptions, que utilizaremos más adelante para configurar el adaptador de nuestro widget de RecyclerView. Al pasar la instancia de consulta al método setQuery() de su constructor, asegúrese de que especificar que los resultados devueltos son en forma de objetos WeightEntry. El código siguiente muestra cómo hacerlo:

Usted puede haber notado que estamos realizando nuestra actividad actual dueño del ciclo de vida del objeto FirestoreRecyclerOptions. Esto es importante porque queremos que nuestro adaptador para responder adecuadamente a eventos de ciclo de vida comunes, como el usuario abre o cierra la aplicación.

En este punto podemos crear un objeto FirestoreRecyclerAdapter, que utiliza el objeto FirestoreRecyclerOptions para configurarse. Porque la clase FirestoreRecyclerAdapter es abstracta, estudio Android automáticamente debe reemplazar sus métodos para generar código que se ve así:

Como se puede ver, la clase de FirestoreRecyclerAdapter es muy similar a la clase RecyclerView.Adapter. De hecho, se deriva de él. Eso significa que se puede utilizar la misma manera se utiliza la clase RecyclerView.Adapter.

Dentro del método onCreateViewHolder(), todo lo que necesitas hacer es inflar el fichero de diseño weight_entry.xml y devolver un objeto de soporte de vista WeightEntryVH basado en él.

Y dentro del método onBindViewHolder(), debe utilizar el argumento de modelo para actualizar el contenido de los widgets de TextView que están presentes en el soporte de vista.

Mientras que el widget de weightView la actualización es sencillo, actualizar el widget timeView es un poco complicado porque no queremos mostrar la fecha y hora, que es en milisegundos, que el usuario directamente.

La forma más fácil de convertir el timestamp en una fecha legible y tiempo es utilizar el método formatDateTime() de la clase DateUtils. Además de la fecha y hora, el método puede aceptar varias banderas diferentes, que utilizará a la fecha y hora. Usted es libre de utilizar indicadores que coincidan con sus preferencias.

Por último, no olvide señalar el widget de RecyclerView para el adaptador que acabamos de crear.

La aplicación está lista. Ahora podrá agregar nuevas entradas y verlos en la lista aparecen casi de inmediato. Si ejecuta la aplicación en otro dispositivo con la misma cuenta de Google, usted verá el mismo peso que las entradas aparecen sobre ella también.

Weight entries shown as a list

Conclusión

En este tutorial, has visto lo rápido y fácil que es crear una aplicación de rastreador de peso totalmente funcional para Android usando Cloud Firestore como una base de datos. ¡No dude en añadir más funcionalidad a él! También sugiero que tratar de publicarla en Google Play. Con el plan de Firebase Spark, que actualmente ofrece 1 GB de almacenamiento gratis, usted no tendrá problemas que sirve por lo menos unos mil usuarios.

Y mientras estés aquí, algunos de nuestros otros posts sobre desarrollo de aplicaciones Android!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.