2012-10-02 16 views
9

Se faccio questo, tutto è buono con la mia itemRef:Posso impedire a Firebase set() di sovrascrivere i dati esistenti?

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

altre proprietà di itemRef rimangono MA child_changed è chiamato due volte

Se faccio questo:

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

child_changed si chiama solo una volta ma le mie altre proprietà vengono distrutte. Esiste una soluzione alternativa a quella maldestra di ripopolamento dell'intero oggetto di riferimento?

Grazie,

Tim

+0

Abbiamo alcune nuove funzionalità non documentate per risolvere questo problema. Puoi mandarmi una e-mail a andrew a firebase dot com? –

+1

Penso che questo sia coperto da "aggiornamento" https://www.firebase.com/docs/javascript-client/firebase/update.html – vonmangle

risposta

13

La funzione di aggiornamento Firebase() vi permetterà di modificare alcuni bambini di un oggetto lasciando invariato altri. La funzione di aggiornamento attiverà solo un evento di "valore" su altri client per il percorso che viene scritto, indipendentemente dal numero di figli modificati.

In questo esempio, si potrebbe fare:

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

Documentazione per update() is here.

+15

È possibile scrivere solo nuovi dati, non sovrascrivendo quelli esistenti? – Qwerty

0

ho cercato di fare questo avere una struttura come la seguente:

Firebase gigs database structure

Il problema che stavo avendo stato durante l'esecuzione di dire impostato su campi specifici come il nome, la descrizione e la data tutti gli altri nodi figli sarebbero poi eliminati con il seguente:

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

lasciando solo il nome, descrizione e la data di nodi, ma utilizzando il seguente i nodi specifici vengono aggiornati senza rimuovere gli altri nodi figlio ovvero membri, immagine ecc .:

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

È possibile creare una regola che impedirà la sovrascrittura se i dati esistono già. qui riprodotto da 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

Ora .Update si prende cura di esso, è possibile modificare i dati esistenti o aggiungerne uno nuovo senza influenzare il resto dei dati già avuto lì.

In questo esempio, utilizzo questa funzione per impostare un prodotto come venduto, il prodotto ha altre variabili con dati e può avere o non avere sold o sellingTime ma non importa cos se non esiste creerà loro e se lo fa, aggiornerà i dati

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) 
}) 

} 
Problemi correlati