簡體   English   中英

Swift Firebase 數據庫覆蓋

[英]Swift Firebase database overwriting

我正在使用 Firebase 制作實時信使。目前,每當我按下一個按鈕時,我希望將一條新消息附加到帶有消息索引的頻道,但目前,每當我按下按鈕時,都會創建一條新消息覆蓋舊消息。 我知道 setValue 通常是問題所在,但我真的不知道我做錯了什么。 添加新消息之前數據庫的樣子 這是我在此處添加新消息后的樣子,然后是我用來添加到數據庫的代碼。

@IBAction func sendMessageTapped(_ sender: Any) {
    if messageTextField.text == "" {
        print("blank")
        return
    } else {
        // First we will update the amount of messages that the channel has.
        ref.child("channels").child(channelName!).setValue(["numberOfMessages" : numberOfMessages+1 ])
        numberOfMessages += 1
        // after we have updated the amount of messages we will try to create a new message.
        ref.child("channels").child(channelName!).child("messages").child(String(numberOfMessages)).child("message").child("content").setValue(messageTextField.text)
        ref.child("channels").child(channelName!).child("messages").child(String(numberOfMessages)).child("message").child("name").setValue("Buddy")

    }
}

好的,Firebase不是傳統的基於表的數據庫,而是基於DOCUMENT的數據庫。 在最頂部,您有一個叫做“集合”的東西,它只是“文檔”東西的列表。 在您的情況下,您將有幾個集合內容可以用作渠道:“常規”,“ TopicQ”,“ InterstingStuff”等,並且其中每個消息都作為文檔。 不需要文檔,然后列出其中的消息。

其次,您在使用索引時不需要索引,將消息ID設置為消息的屬性,因為Firebase支持按字段查詢,即使這樣,還是有問題的,因為如果將每條消息都設為文檔,它們將具有如果需要,可以使用自己的自動生成的ID。

第三,在您的代碼中每次都重寫整個文檔,這就是為什么您丟失以前的消息的原因,因此,如果保留它,則需要添加合並選項:

// Update one field, creating the document if it does not exist.
db.collection("cities").document("BJ").setData([ "capital": true ], merge: true)

你可能想做這樣的事情。 這就是我為我的應用程序所做的,希望這對某人有所幫助。 此 rootRef.childByAutoId() 生成一個具有唯一 ID 的新條目。 您可以將其用作您的案例的參考。

 let rootRef = Database.database().reference(withPath: "channels")
 let childRef = rootRef.childByAutoId()
 let values = ["Type": self.textField.text!, "message": self.textView.text!] as? [String : Any]
 childRef.updateChildValues(values)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM