Firebase Realtime Database es una base de datos alojada en la nube, es decir, se ejecuta en una nube y el acceso al usuario se proporciona como un servicio. Almacena datos en formato JSON (Javascript Object Notation) , un formato para almacenar o transportar datos. Todos los usuarios conectados a él pueden obtener acceso a los datos en tiempo real.
¿Características de Firebase Realtime Database?
- Tiempo real : debido a la sincronización de datos utilizada en tiempo real, los dispositivos/clientes reciben todas las actualizaciones en poco tiempo.
- No se necesita un servidor de aplicaciones : como se puede acceder a la base de datos directamente desde el dispositivo móvil o el navegador, no se necesita un servidor de aplicaciones.
- Soporte por varios lenguajes y plataformas :
- División de datos : el cliente puede dividir los datos en varias instancias de base de datos para el mismo proyecto.
- Código del lado del cliente : se puede acceder a las aplicaciones dinámicas con los datos protegidos directamente desde el código del lado del cliente.
- Multiplataforma : se puede usar para crear un back-end para varias plataformas como Android, iOS, Web, iOS y JavaScript SDK.
Estructuración de la base de datos en tiempo real:
Firebase Realtime Database almacena datos como un gran árbol JSON . Almacena datos simples fácilmente, pero los datos jerárquicos no estructurados son difíciles de organizar. A diferencia de SQL, aquí no hay tablas.
- ¿Qué es el modelo de árbol JSON?
JSON Tree Model está inspirado en JSON (Notación de objetos de JavaScript) que se utiliza para representar el documento JSON, que generalmente consta de un par clave-valor en la memoria. - ¿Por qué estructurar los datos (Cuáles son las ventajas de hacerlo)?
- Si los datos se almacenan en una estructura bien formateada, es fácil guardarlos y recuperarlos fácilmente.
- La consulta se vuelve fácil en los datos estructurados.
- Se vuelve factible referir los datos en formato estructurado.
- Puntos clave para recordar al estructurar los datos:
Antes de escribir y leer los datos en la base de datos, el objetivo principal del desarrollador debe ser construir la estructura de la base de datos.
- Considere el límite de anidamiento:
el anidamiento de los datos debe realizarse de manera adecuada, de modo que sea fácil de leer utilizando los oyentes (los oyentes están acostumbrados a leer los datos de la base de datos). Evite el anidamiento innecesario de niveles en la base de datos. Firebase también permite solo 32 niveles de Nesting.Por ejemplo:
// JSON Format Structuring Simple Example { "userinfo": { "a": { "name": "GfG1", "address":"GeeksForGeeksOne", "order_details": { "p1": { "product_id":"1", "quantity":"5", "price":"500", "address_of_delivery":"xyz, abc, ..." }, "p2": { "product_id":"2", "quantity":"10", "price":"1000", "address_of_delivery":"xyz2, abc, ..." } } }, "b": { "name": "GfG2", "address":"GeeksForGeeksTwo", "order_details": { "p1": { "product_id":"1", "quantity":"12", "price":"1500", "address_of_delivery":"pqr, abc, ..." }, "p2": { "product_id":"2", "quantity":"18", "price":"1000", "address_of_delivery":"pqr2, abc, ..." } } } } }
En este ejemplo, recuperar los datos de los nombres de los usuarios es muy difícil ya que tenemos que acceder a los Nodes secundarios de users_info que descargan los datos que tienen varios MB de tamaño (en este caso, se descarga el nombre, los detalles de los pedidos, la dirección, etc.).
- Diseñe una forma desnormalizada de datos:
el aplanamiento de los datos debe realizarse correctamente, lo que significa que los datos deben dividirse en diferentes partes sin ninguna ambigüedad. Esto generalmente se conoce como desnormalización, donde para mejorar el rendimiento de lectura desarrollamos redundancia en los datos.Por ejemplo:
// JSON Format Example with Denormalized form for example in Point 1 { "user_info": { "a": { "name": "GfG1", "address":"GeeksForGeeksOne" }, "b": { "name": "GfG2", "address":"GeeksForGeeksTwo" } }, "order_details": { "a": { "p1": { "product_id":"1", "quantity":"5", "price":"500", "address_of_delivery":"xyz, abc, ..." }, "p2": { "product_id":"2", "quantity":"10", "price":"1000", "address_of_delivery":"xyz2, abc, ..." } }, "b": { "p1": { "product_id":"1", "quantity":"12", "price":"1500", "address_of_delivery":"pqr, abc, ..." }, "p2": { "product_id":"2", "quantity":"18", "price":"1000", "address_of_delivery":"pqr2, abc, ..." } } } }
En este ejemplo, los datos se dividen como user_info y order_deatils. Debido a esto, la accesibilidad de los datos es más rápida y, por lo tanto, no es necesario descargar los datos innecesarios de gran tamaño. Aquí, recuperar los datos de los nombres de los usuarios es muy simple, ya que tenemos que acceder a los Nodes secundarios de users_info que descargan los datos que tienen solo un nombre y una dirección y no se procesan los detalles de los pedidos.
- Cree una estructura que sea de naturaleza dinámica:
la estructuración de los datos debe ser tal que sea escalable. A veces, para tener fácil acceso a los datos, es necesario implementar la duplicación en la base de datos.Por ejemplo:
// JSON Format Example explaining the Scaling property { "student_info": { "1": { "name":"GfG1", "roll_no":"1", "exam_board":"abc" }, "2": { "name":"GfG2", "roll_no":"2", "exam_board":"pqr" }, "3": { "name":"GfG3", "roll_no":"3", "exam_board":"abc" } }, "board_info": { "abc": { "student_names": { "GfG1":true, "GfG2":false, "GfG3":true } }, "pqr": { "student_names": { "GfG1":false, "GfG2":true, "GfG3":false } } } }
En el ejemplo anterior, para acceder fácilmente a la base de datos, el nombre de la pizarra se almacena en la información de cada estudiante, así como la información de la pizarra almacena el nombre del estudiante y la pizarra que tiene. Si no hubiéramos almacenado los datos en la información de la pizarra, sería difícil recopilar los nombres de los estudiantes que tienen una pizarra en particular.
- Considere el límite de anidamiento:
Escribir/insertar datos en Firebase Realtime Database
Escribir los datos en Firebase es una tarea muy fácil. Pero antes de escribir / insertar los datos en la base de datos en tiempo real, se debe realizar la estructuración de los datos . La inserción o escritura de datos en la base de datos Firebase Realtime se realiza en Android mediante la función setValue() . Insertar los datos en la base de datos de Firebase Realtime se puede considerar como una de las operaciones CRUD.
setValue(): Esta función se utiliza para:
- Reemplace los datos en la posición de referencia
- Si no hay datos presentes en la posición de referencia, escribe los datos directamente en esa posición
Los valores/tipos que se le pueden pasar son:
- Cuerda
- Mapa
- Lista
- Doble
- booleano
- Largo
- Objeto definido por el usuario : aquí, se debe considerar que el objeto definido por el usuario que tiene un constructor predeterminado también se puede pasar como argumento a la función.
Pasos para escribir/insertar datos en Firebase Realtime Database:
considere que tenemos que almacenar el nombre del usuario en la base de datos
- Crear una referencia de base de datos:
// Consider that we have to store // this in the database String name = "GfG1" ;
- Encuentre la referencia de los datos donde se almacenará el valor usando la función child():
// Create an object of Firebase Database Reference DatabaseReference reference; reference = FirebaseDatabase.getInstance().getReference();
- Utilice el objeto al que se hace referencia y la función setValue() con el valor que se va a almacenar como argumento para escribir los datos:
//Inserts the data to the database reference.child("user").setValue(name);
Ejemplo 2: Consideremos otro ejemplo para almacenar el objeto definido por el usuario en la base de datos
- PASO 1:
// Create a class User class User { String name; String address; User() { name = ""; address = ""; } User(String name, String address) { this.name = name; this.address = address; } }
- PASO 2:
// Create a user-defined object User user1 = new User("GfG1", "GeeksForGeeks");
- PASO 3:
// Create an object of Firebase Database Reference DatabaseReference reference ; reference = FirebaseDatabase.getInstance().getReference(); // Insert the user-defined object to the database reference.child("user").setValue(user1);