2012-10-02 38 views
9

Si hago esto, todo es bueno con mi refElem: otros¿Puedo evitar que Firebase set() sobrescriba los datos existentes?

itemRef.child('appreciates').set(newFlag); 
itemRef.child('id').set(newId); 

propiedades de refElem permanecen PERO child_changed se llama dos veces

Si hago esto:

itemRef.set({appreciates:newFlag,id:newId}); 

child_changed se llama solo una vez, pero mis otras propiedades son destruidas. ¿Existe una solución además de la torpe de repoblar todo el objeto de referencia?

Gracias,

Tim

+0

Tenemos algunas nuevas características no documentadas para solucionar este problema. ¿Pueden enviarme un correo electrónico a andrew a firebase dot com? –

+1

Creo que esto ahora está cubierto por la "actualización" https://www.firebase.com/docs/javascript-client/firebase/update.html – vonmangle

Respuesta

13

La función de actualización Firebase() le permitirá modificar algunos hijos de un objeto dejando a otros sin cambios. La función de actualización solo activará un evento de "valor" en otros clientes para la ruta que se está escribiendo, sin importar cuántos hijos se cambien.

En este ejemplo, se podría hacer:

itemRef.update({appreciates:newFlag,id:newId}); 

Documentación para update() is here.

+15

¿Es posible escribir solo datos nuevos, sin sobreescribirlos? – Qwerty

0

que he estado tratando de hacer esto con una estructura como la siguiente:

Firebase gigs database structure

El problema que tenía era cuando se ejecuta decir fijado en campos específicos, tales como nombre, descripción y fecha de todos los demás nodos secundarios serían entonces ser retirados con lo siguiente:

return (dispatch) => { 
    firebase.database().ref(`/gigs/${uid}`) 
     .set({ name, description, date }) 
     .then(() => { 
      dispatch({ type: GIG_SAVE_SUCCESS }); 
      Actions.home({ type: 'reset' }); 
     }); 
}; 

dejando sólo el nombre, descripción y fecha linfáticos, pero utilizando la siguiente los nodos específicos se actualizan sin la eliminación de los demás nodos secundarios es decir, miembros, imagen, etc.:

return (dispatch) => { 
    var ref = firebase.database().ref(`/gigs/${uid}`); 
    ref.child('name').set(name) 
    ref.child('description').set(description) 
    ref.child('date').set(date) 
     .then(() => { 
      dispatch({ type: GIG_SAVE_SUCCESS }); 
      Actions.home({ type: 'reset' }); 
     }); 
}; 
0

Puede crear una regla que evite las sobreescrituras si los datos ya existen. reproducen aquí de Firebase docs Existing Data vs New Data

// we can write as long as old data or new data does not exist 
// in other words, if this is a delete or a create, but not an update 
".write": "!data.exists() || !newData.exists()" 
0

Ahora .Update se encarga de ello, puede cambiar los datos existentes o añadir uno nuevo sin afectar al resto de los datos que ya tenía allí.

En este ejemplo, uso esta función para configurar un producto como vendido, el producto tiene otras variables con datos y puede o no tener sold o sellingTime pero no importa porque si no existe creará ellos y si lo hace, actualizará los datos

var sellingProduct = function(id){ 
dataBase.ref('product/'+id).update({ 
    sold:true, 
    sellingTime: Date.now(), 

}).then (function(){ 
    alert ('your product is flaged as sold') 

}).catch(function(error){ 
    alert ('problem while flaging to sold '+ error) 
}) 

} 
Cuestiones relacionadas