Base de datos en tiempo real

  video[Tutorial Introducing Firebase Realtime Database

Las principales características que podemos destacar de las bases de datos en tiempo real integradas en Firebase son:

  • La base de datos es alojada en la nube. No tienes que preocuparte de buscar un servidor e instalar software. Google se encarga de todo.
  • Los datos se almacenan en formato JSON. Se trata de una base de datos NoSQL. Más adelante ampliamos este concepto.
  • Sincronización en tiempo real. Cualquier cambio en los datos hace que los clientes reciban actualizaciones en cuestión de milisegundos.
  • Permite apps multiplataforma iOS, Android y Web (JavaScript). Todos tus clientes comparten la misma base de datos y reciben actualizaciones de forma automática con los datos más nuevos independientemente de su plataforma. Además, disponemos de un API REST para acceder a la base de datos desde otras plataformas.
  • Si el dispositivo pierde la conexión a Internet tu aplicación podrá seguir funcionando. Mientras tanto se trabajará con una caché. Cuando se recupere la conexión, la información será actualizada.
  • Gran escalabilidad. Solución especialmente indicada para bases de datos de gran tamaño (bigdata).

Ejercicio: Escribir en la base de datos

1.     Los datos de tu base de datos están protegidos para que solo los usuarios autorizados puedan acceder. Firebase incorpora un completo sistema de autentificación que será descrito más tarde. De momento vamos a dar acceso público a toda la base de datos para poder realizar este ejercicio.

Accede a la consola de Firebase y selecciona el proyecto Prueba. En la columna de la izquierda selecciona Database y en las pestañas de la parte superior selecciona RULES.

Reemplaza las reglas predeterminadas por las siguientes:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}	

De esta forma se podrá accedes a la base de datos, aunque los usuarios no estén identificados. Para más información sobre las reglas de las bases de datos: https://firebase.google.com/docs/database/security/

2.     Añade al fichero Gradle Scripts/Bulid.gradle (Module:app) la siguiente dependencia:

dependencies {
    … 
    compile 'com.google.firebase:firebase-database:9.2.1'
}		

NOTA:Es interesante que reemplaces :9.2.1por la última versión disponible. Otra posibilidad para añadir esta dependencia consiste en seleccionar File / Project Structure… / Modules: app / Dependencies / + / Libray dependency / firebase-database. La ventaja de esta opción es que indicaremos la última versión disponible.

3.     En la clase MainActivity, dentro del método onCreate(), dentro de onClick()  inserta las líneas:

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("mensaje");
myRef.setValue("¡Hola, Mundo!");

Comenzamos obteniendo una instancia de tu base de datos usando getInstance(). A continuación se obtiene una referencia a la localización donde se quiere escribir usando getReference(). Mediante setValue()asignamos un valor a la referencia. Si estás acostumbrado a trabajar con bases de datos convencionales (SQL) habrás observado que esta forma de proceder no se parece en nada a lo que conoces. Más adelante describimos en que consiste la nueva filosofía.

dependencies {
    … 
    compile 'com.google.firebase:firebase-database:9.2.1'
}		

4.     Dentro del mismo método donde acabas de insertar estas líneas se muestra un mensaje con un Snackbar. Reemplaza este mensaje por “Escribiendo en la base de datos”.

5.     Ejecuta la aplicación y pulsa en el botón flotante.

6.     En la consola de Firebase selecciona la pestañas DATOS. Observa como se ha añadido un nuevo nodo a la base de datos:

7.     En el código de la aplicación reemplaza “mensaje” por “mensaje2”. Puedes cambiar también la información que vas a escribir en este nodo.

8.     Pon el dispositivo donde estás ejecutando la aplicación en modo avión. Ejecuta la nueva versión de la aplicación y pulsa en el botón flotante.

9.     Observa que la aplicación no muestra ningún error, aunque no disponga de conexión con el servidor. Desde la consola de Firebase el nuevo nodo no ha de aparecer.

10.     Quita el modo avión del dispositivo. Observa cómo, sin necesidad de realizar ninguna acción, el nuevo nodo aparece en la consola.

Ejercicio: Leer de una base de datos

1.     Podemos conseguir que nuestra aplicación ejecute un código cada vez que se modifique algún valor de la base de datos. Para ver como se realizaría insertaa el siguiente código dentro del método onCreate():

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("mensaje");
myRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String value = dataSnapshot.getValue(String.class);
        Log.d("Ejemplo Firebase", "Valor: " + value);
    }

    @Override
    public void onCancelled(DatabaseError error) {
        Log.w("Ejemplo Firebase", "Error al leer.", error.toException());
    }
});

Las dos primeras líneas coinciden con el ejercicio anterior. A continuación, añadimos un escuchador de eventos a la referencia. El primer método será ejecutado cuando el valor de la referencia cambie. Se nos pasará como parámetro una instancia de los datos. En este método obtenemos el valor de la instancia y lo mostramos en el log. El segundo método será ejecutado en caso de cancelación de la operación.   

2.     Esta vez vamos a modificar el valor de mensaje, directamente desde la consola de Firebase. Selecciona la pestaña DATOS. pulsa sobre el nodo mensaje e introduce un nuevo valor:

3.     En Android Studio selecciona en la pestaña Android Monitor. Observa como en el logcat aparece:

…
…/com.example.ejemplofirebase D/Ejemplo Firebase: Valor: ¡Hola, Mundo! 2