Firebase : Usar la base de datos
La base de datos (Database) en tiempo real de Firebase es una de sus herramientas más útiles; por defecto, sólo los usuarios autentificados pueden acceder a ella; sin embargo, si quisiéramos, podríamos establecer reglas particulares e incluir usuarios anónimos pero no creo que eso sea una buena idea.
Vamos a partir de lo que hemos hecho en la primera parte así que los usuarios deben autentificarse con Google.
La estructura de la base de datos de Firebase es distinta a las que acostumbramos ver en otros lenguajes ya que sigue las reglas del formato JSON y eso es lo que nos permite manipularla con JavaScript de manera segura.
Construyamos una sencilla. Imaginemos que queremos que los usuarios amplíen su perfil incorporando datos extras. Lo primero que debemos hacer es pensar cuál será la mejor forma de estructurar esos datos. Por ejemplo les pediremos que ingresen una palabra y nos califiquen; además guardaremos la fecha de la última modificación y un par de datos como el lenguaje del navegador y el sistema operativo que utilizan:
usuarios : { abcdefghij01234 : { palabra : string, calificacion : int, fecha : date, tecno : { lenguaje : string, platforma : string } }, klmnopqrstuv56789 : { palabra : string, calificacion : int, fecha : date, tecno : { lenguaje : string, platforma : string } }, }
La complejidad de esa estructura y el método más adecuado dependerá de cada circunstancia; los datos pueden ser de cualquier tipo admitido por JSON incluyendo otros objetos.
En este ejemplo, para organizar nuestra base de datos, usaremos el identificador único que se genera al registrarse y le pediremos al usuario que defina algunos ítems mientras que agregaremos otros automáticamente.
Para referenciar la base de datos usamos la función database().ref() donde el parámetro será la ruta del JSON definida por nosotros:
firebase.database().ref("ruta")
Que en este caso será usuarios seguido por el identificador del usuario y separado por una barra, del mismo modo que se si escribiéramos una dirección url.
Entonces, una vez que el usuario está registrado, lo primero que debemos hacer es verificar si esos datos extras ya están en nuestra base o si debemos agregarlos. Como sólo necesitamos leer eso una sola vez, usaremos la función once().
var uid = firebase.auth().currentUser.uid; // el identificador del usuario actual var BDD= firebase.database().ref('usuarios/'+uid); // referencia a la base de datos BDD.once("value", function(data){ if(data.val()!==null){ // hay datos que podemos leer } else { // aún no hay datos } })
Usamos value porque queremos leer el contenido de esa ruta tal como está pero podríamos solicitar que solo se nos mostrarán los datos nuevos (child_added) o los eliminados (child_removed o aquellos que han cambiado (child_changed) o movido (child_moved).
Para escribir un dato usamos el método set() donde algunos estarán vacios porque será el usuario quien deba agregarlos y otros serán automáticos.
Si existen, los datos los leemos de modo similar con la función val().
Usaremos un objeto JSON llamado DATOS para contener esos datos:
var uid = firebase.auth().currentUser.uid; // identificador único del usuario var BDD= firebase.database().ref('usuarios/'+uid); // referencia a la base de datos BDD.once("value", function(data){ if(data.val()!==null){ // hay datos asi que los leemos var DATOS = data.val(); // y los mostramos } else { // no hay datos asi que guardamos los datos iniciales por defecto var DATOS = { palabra : "", calificacion : 5, fecha : new Date().toLocaleDateString(), tecno : { lenguaje : navigator.language, plataforma : navigator.platform } }; BDD.set(DATOS); // y los mostramos } })
En cualquier momento podemos ir a la consola de Firebase y ver la base de datos porque esta se actualizará en tiempo real:
Lo que nos faltaría es poder editar esos datos en cualquier momento y para eso usamos la función update() porque no queremos añadir un nuevo registro sino sobrescribir los valores existentes:
var DATOS = { palabra : "la_palabra_ingresada", calificacion : valor_ingresado, fecha : new Date().toLocaleDateString(), tecno : { lenguaje : navigator.language, plataforma : navigator.platform } }; var uid = firebase.auth().currentUser.uid; var updates = {}; updates['/usuarios/'+uid] = DATOS; firebase.database().ref().update(updates);
¿Y si sólo quisiéramos modificar un dato? En ese caso, deberíamos establecer la ruta exacta; por ejemplo, para cambiar el valor de palabra:
var uid = firebase.auth().currentUser.uid; var updates = {}; updates['/usuarios/'+uid+'/palabra'] = "ejemplo"; firebase.database().ref().update(updates);
Ahora ... probemos: