2016-03-26 75 views
4

我是Firebase的新手,不確定如何最好地解釋這一點,但我會嘗試。Firebase覆蓋條目

我想讓我的應用程序爲每個用戶創建一個條目。然後每個用戶條目都有多個(0到n)子條目,其中每個子條目都是一個簡單的字符串。基本上有一個用戶ID(主條目),他們的任務是子條目。

現在我的問題是,無論何時將數據(子條目)推送到主條目,以前的所有子條目都將被刪除,並且只推送最近的條目。我一直在瀏覽文檔和Google瘋狂搜索,但似乎沒有任何工作。

我已經試過這樣:

@IBAction func testWrite(sender: AnyObject) { 
    let def = NSUserDefaults.standardUserDefaults() 
    let uid = def.valueForKey("uid") 
    let root = Firebase(url: getFirebaseURL()) 

    let text = self.tempText.text! 
    let dataRef = root.childByAppendingPath(uid as! String) 
    let data = ["test": String(text)] 
    dataRef.setValue(data) 
} 

其中追加到用戶ID輸入細末,用「測試」的關鍵和「文」

的值,於是我殺應用程序,並將其更改爲:

@IBAction func testWrite(sender: AnyObject) { 
    let def = NSUserDefaults.standardUserDefaults() 
    let uid = def.valueForKey("uid") 
    let root = Firebase(url: getFirebaseURL()) 

    let text = self.tempText.text! 
    let dataRef = root.childByAppendingPath(uid as! String) 
    let data = ["CHANGED": String(text)] 
    dataRef.setValue(data) 
} 

它推得很好,但是之後的條目剛剛被刪除,剩下的唯一條目就是這一條。

我想要做的事可能是增量式(有一個數字鍵可能?)逐項添加項目,而不刪除其他條目。

我希望這是有道理的:P和任何幫助,非常感謝!

回答

4

這是怎麼回事這裏,您正在設置整支(用戶/用戶名##),一個值,該值是單節點Changed:<somestring>

從概念上講,它可以幫助想關鍵要設定爲只是另一個分支如(用戶/用戶名##/##的TaskID)

所以在概念上,而不是接近這樣的:
Users/UserID = Key:Value

接近它是這樣的:
Users/UserID/Key = Value

注:分支Users/UserID/Key沒有給你分配一個值之前存在。


例如,你可以在你要添加的子項或改變而改變你的參照點:

let dataRef = root.childByAppendingPath(uid as! String + "/Task001") 
dataref.setValue(String(text)) 

我同意,你在做什麼,是開始學習火力地堡的好方法,以及它是如何工作的。但是一旦你開始使用,而不是爲你的子任務列表生成和使用你自己的密鑰,請仔細研究一下childByAutoId,它會自動爲你創建子密鑰,還有更多,並且更易於管理和編碼。

Documentation Here

編輯:建議參照弗蘭克的更好的回答以下。

+0

哦,我明白你的意思了。 childByAutoId早些時候給我帶來了麻煩,但我會再次嘗試一下,並隨時隨地玩。謝謝! – dsch

+1

只需要在這裏添加,感謝您的AutoId提示。它的功能非常好,而且確實很容易管理。再次感謝 – dsch

4

的替代@ MtlDev的回答是使用​​:

let data = ["CHANGED": String(text)] 
dataRef.updateChildValues(data) 

雖然setValue()用新值替換當前的數據,​​到位更新它。

請參閱Firebase documentation on updating saved data

+0

這比使用setValue好多了,謝謝! – dsch

+0

兩者都有其用例。在更新單個屬性時,我通常使用'serValue()',因爲它可以防止需要字典。當更新多個屬性(但仍然是對象的一個​​子集)時,'updateChildValue()'是你唯一的,因此是最好的選擇。 :-) –