2012-10-02 35 views
9

如果我这样做,一切都很好用我的itemref:的itemref的我可以防止Firebase set()覆盖现有数据吗?

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

其他属性保持,但如果我这样做child_changed被调用两次

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

child_changed被称为只有一次,但我的其他物业被摧毁。 除了重新填充整个参考对象的笨拙之外,还有一种解决方法吗?

感谢,

+0

我们有一些未公开的新功能来解决这个问题。你能给我发电子邮件给安德鲁在firebase点com吗? –

+1

我认为这现在已覆盖“更新” https://www.firebase.com/docs/javascript-client/firebase/update.html – vonmangle

回答

13

的火力地堡update()函数将允许您同时保留其他不变修改一个对象的一些孩子。无论有多少孩子被更改,更新功能只会触发其他客户端上的一个“值”事件,用于写入的路径。

在这个例子中,你可以这样做:

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

的文档update() is here

+15

是否可以只写入新数据,而不是覆盖现有的? – Qwerty

0

我一直在努力做到这一点具有如下所示的结构:

Firebase gigs database structure

运行时,是我在这个问题上说的具体领域,如名称,描述和日期,所有的设置

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

只留下了名称,描述和日期节点,但使用以下的特定节点更新而不删除其他子节点:其他子节点然后将用下面的删除即成员,图像等:

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

如果数据已经存在,您可以创建一个防止覆盖的规则。 这里转载自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

现在.update需要照顾它,你可以改变现有的数据或增加新的一个,而不会影响数据的你已经有了那里休息。

在这个例子中,我使用这个函数来设置一个产品出售,产品有其他变量的数据,可能或可能没有soldsellingTime但它并不重要,因为如果它不存在将创建他们,如果它,将更新数据

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

}