Anuncio de Cloud Firestore (Beta): Prueba la nueva base de datos escalable y flexible de Firebase y Google Cloud Platform. Obtén más información sobre Cloud Firestore.

Cómo leer y escribir datos en la Web

Obtén una referencia a una base de datos

Para leer la base de datos o escribir en ella, necesitas una instancia de firebase.database.Reference:

// Get a reference to the database service
var database = firebase.database();

Lectura y escritura de datos

En este documento, se tratan los aspectos básicos de la recuperación de datos y de cómo ordenar y filtrar datos en Firebase.

Para recuperar los datos de Firebase, se debe agregar un agente de escucha asíncrono a firebase.database.Reference. El agente de escucha se activa una vez para el estado inicial de los datos y otra vez cuando los datos cambian.

Operaciones básicas de escritura

Para ejecutar operaciones de escritura básicas, puedes usar set() para guardar datos en una referencia que especifiques y reemplazar los datos existentes en esa ruta de acceso. Por ejemplo, una aplicación social de blogs puede agregar un usuario con set() de la siguiente manera:

function writeUserData(userId, name, email, imageUrl) {
  firebase.database().ref('users/' + userId).set({
    username: name,
    email: email,
    profile_picture : imageUrl
  });
}

Si usas set(), se sobrescriben los datos en la ubicación que especificas, incluidos todos los nodos secundarios.

Detecta eventos de valores

Si deseas leer datos de una ruta y escuchar para detectar cambios, usa los métodos on() o once() de firebase.database.Reference para observar eventos.

Evento Uso común
value Lee y detecta cambios en todo el contenido de una ruta.

Puedes usar el evento value para leer una instantánea estática del contenido de una ruta de acceso determinada, en el estado en que se encontraba en el momento del evento. Este método se activa cuando se vincula el agente de escucha y se vuelve a activar cada vez que cambian los datos (incluidos los de nivel secundario). La devolución de llamada del evento recibe una instantánea que contiene todos los datos de dicha ubicación, incluidos los datos secundarios. Si no hay datos, la instantánea tiene el valor null.

El siguiente ejemplo demuestra una aplicación social de blogs que recupera el recuento de estrellas de una publicación desde la base de datos:

var starCountRef = firebase.database().ref('posts/' + postId + '/starCount');
starCountRef.on('value', function(snapshot) {
  updateStarCount(postElement, snapshot.val());
});

El agente de escucha recibe una snapshot que contiene los datos de la ubicación específica en la base de datos en el momento del evento. Puedes recuperar los datos de la snapshot con el método val().

Lee los datos una sola vez

En algunos casos, deseas tener una instantánea de los datos sin detectar cambios, como cuando inicializas un elemento de IU que no debería cambiar. Puedes usar el método once() para simplificar esta situación: se activa una vez y no vuelve a activarse.

Esto resulta útil para los datos que solo se deben cargar una vez y que, según lo esperado, no cambiarán con frecuencia ni necesitarán una escucha activa. Por ejemplo, en la app de blogs de los ejemplos anteriores se usa este método para cargar el perfil de un usuario cuando este comienza a crear una publicación nueva:

var userId = firebase.auth().currentUser.uid;
return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot) {
  var username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
  // ...
});

Actualiza o borra datos

Actualiza campos específicos

Para escribir de forma simultánea en elementos secundarios específicos de un nodo sin sobrescribir otros nodos secundarios, usa el método update().

Cuando llamas a update(), puedes especificar una ruta de acceso de la clave para actualizar elementos secundarios de nivel inferior. Si se almacenan datos en varias ubicaciones para obtener un escalamiento mejor, puedes actualizar todas las instancias de esos datos mediante la distribución de datos.

Por ejemplo, es posible que una app social de blogs cree una publicación y que esta se actualice de forma simultánea en el feed de actividad reciente y en el feed de actividad de publicaciones del usuario con un código como el siguiente:

function writeNewPost(uid, username, picture, title, body) {
  // A post entry.
  var postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  var newPostKey = firebase.database().ref().child('posts').push().key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  var updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return firebase.database().ref().update(updates);
}

Este ejemplo usa push() para crear una entrada en el nodo que contiene las entradas de todos los usuarios en /posts/$postid y recupera la clave de manera simultánea. Esta clave se puede usar para crear una segunda entrada en las publicaciones del usuario en /user-posts/$userid/$postid.

Con estas rutas de acceso, puedes ejecutar actualizaciones simultáneas en varias ubicaciones del árbol JSON con una única llamada a update(), de manera similar a este ejemplo en el que se crea la publicación nueva en ambas ubicaciones. Las actualizaciones simultáneas que se ejecutan de esta forma son atómicas: todas las actualizaciones se aplican correctamente o todas fallan.

Borra datos

La forma más sencilla de borrar datos es llamar a remove() en una referencia a la ubicación de los datos.

Para borrar, también puedes especificar null como el valor de otra operación de escritura, como set() o update(). Puedes usar esta técnica con update() para borrar varios elementos secundarios en una misma llamada de la API.

Recibe una Promise

Para saber en qué momento se confirman los datos en el servidor de Firebase Realtime Database, puedes usar una Promise. Tanto set() como update() pueden dar como resultado una Promise que puedes usar para saber cuándo se confirma la escritura en la base de datos.

Desvincula agentes de escucha

Para borrar las devoluciones de llamada, llama al método off() en tu referencia de la base de datos de Firebase.

Para quitar un solo agente de escucha, puedes pasarlo como parámetro a off(). Si llamas a off() en la ubicación sin argumentos, se quitarán todos los agentes de escucha de esa ubicación.

Si llamas a off() en un agente de escucha primario, no se quitan de manera automática los agentes de escucha registrados en sus nodos secundarios. Deberás llamar a off() también en todos los agentes de escucha secundarios para borrar la devolución de llamada.

Guarda datos como transacciones

Cuando trabajas con datos que se podrían dañar si se hacen cambios simultáneos (por ejemplo, contadores incrementales) puedes usar una operación de transacción. Esta operación acepta una función de actualización y una devolución de llamada opcional de finalización. La función de actualización toma el estado actual de los datos como argumento y genera el nuevo estado que deseas escribir. Si otro cliente escribe en la ubicación antes de que tu valor nuevo se escriba correctamente, se hace un nuevo llamado a la función de actualización con el nuevo valor actual y se vuelve a intentar la operación de escritura.

Por ejemplo, en la app social de blogs de ejemplo, podrías permitir que los usuarios agreguen o quiten estrellas en las entradas y llevar un seguimiento de cuántas estrellas recibió una entrada de la siguiente forma:

function toggleStar(postRef, uid) {
  postRef.transaction(function(post) {
    if (post) {
      if (post.stars && post.stars[uid]) {
        post.starCount--;
        post.stars[uid] = null;
      } else {
        post.starCount++;
        if (!post.stars) {
          post.stars = {};
        }
        post.stars[uid] = true;
      }
    }
    return post;
  });
}

Si usas una transacción, evitas que el recuento de estrellas sea incorrecto en caso de que varios usuarios agreguen estrellas a la publicación al mismo tiempo o el cliente tenga datos inactivos. Si se rechaza la transacción, el servidor le muestra el valor actual al cliente, que vuelve a ejecutar la transacción con el valor actualizado. Esto se repite hasta que la transacción se acepta o abortas la transacción.

Escribe datos sin conexión

Si un cliente pierde su conexión de red, tu app continuará funcionando de manera correcta.

Todos los clientes conectados a una base de datos de Firebase mantienen su propia versión interna de los datos activos. Cuando se escriben datos, se hace primero en esta versión local. Después, el cliente de Firebase sincroniza esos datos con los servidores de bases de datos remotas y con otros clientes según el “mejor esfuerzo”.

Como resultado, todas las operaciones de escritura en la base de datos activan eventos locales de inmediato, antes de que se escriban datos en el servidor. Esto significa que tu app conserva su capacidad de respuesta, sin importar la latencia o el estado de conexión de la red.

Cuando se restablece la conexión, tu app recibe el conjunto de eventos adecuado, de manera que el cliente se sincroniza con el estado actual del servidor sin tener que escribir código personalizado.

Pasos siguientes

Enviar comentarios sobre…

Firebase Realtime Database
¿Necesitas ayuda? Visita nuestra página de asistencia.