2012-10-02 11 views
9

Jeśli mogę to zrobić, wszystko jest dobrze z moim itemRef:Czy mogę zapobiec nadpisywaniu istniejących danych przez funkcję Firebase()?

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

inne właściwości itemRef pozostają ALE child_changed nazywa dwukrotnie

Gdybym to zrobić:

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

child_changed nazywa tylko raz, ale moje inne własności są niszczone. Czy istnieje obejście poza niezdarnym ponownym zaludnieniem całego obiektu referencyjnego?

Dzięki,

Tim

+0

Mamy kilka nieudokumentowanych nowych funkcji w celu rozwiązania tego problemu. Czy możesz przesłać mi e-mail na adres andrew w witrynie firebase dot com? –

+1

Myślę, że jest to teraz objęte "aktualizacją" https://www.firebase.com/docs/javascript-client/firebase/update.html – vonmangle

Odpowiedz

13

Funkcja Firebase update() pozwoli Ci zmodyfikować niektóre dzieci obiektu pozostawiając inne bez zmian. Funkcja aktualizacji wyzwoli tylko jedno zdarzenie "wartości" na innych klientach dla zapisywanej ścieżki, bez względu na to, ile dzieci zostanie zmienionych.

W tym przykładzie, można zrobić:

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

Dokumentacja dla update() is here.

+15

Czy można pisać tylko nowe dane, a nie zastępować istniejące? – Qwerty

0

Próbowałem to zrobić, mający strukturę jak poniżej:

Firebase gigs database structure

Problem miałem został ustawiony podczas uruchamiania powiedzieć o konkretnych dziedzinach, takich jak: nazwa, opis i wszystkie z datą inne węzły potomne będą następnie usuwane z następujących czynności:

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

pozostawiając tylko nazwę, opis i data węzły stosując następujące konkretne węzły są aktualizowane bez usuwania innych węzłów potomnych tj. członkowie, obraz itp:

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

Możesz utworzyć regułę, która zapobiegnie zastępowaniu, jeśli dane już istnieją. tu skopiowany 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

Teraz .update dba o niego, można zmienić istniejące dane lub dodać nową bez wpływu na pozostałe dane, które już istnieją.

W tym przykładzie mogę używać tej funkcji, aby ustawić sprzedawanego produktu, produkt ma inne zmienne z danymi i może lub nie może mieć sold lub sellingTime ale to nie ma znaczenia, czy cos nie istnieje stworzy one i jeśli to zrobi, zaktualizuje dane

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

}