Быстрая перезапись базы данных Firebase

Я делаю мессенджер в реальном времени, используя 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")

    }
}

person Jacob    schedule 26.11.2018    source источник
comment
Пара вещей: а) не используйте числовые индексы в базах данных NoSQL. По сути, это массив и массивы Злы. б) Вы каждый раз перезаписываете узел сообщений, поэтому у вас всегда есть только один узел.   -  person Jay    schedule 26.11.2018


Ответы (1)


хорошо, Firebase - это не традиционная база данных на основе таблиц, это база данных на основе ДОКУМЕНТОВ. В самом верху у вас есть вещь, называемая «коллекцией», которая представляет собой просто список «документов». В вашем случае у вас будет несколько элементов коллекции, которые будут использоваться в качестве каналов: «Общие», «TopicQ», «InterstingStuff» и т. Д., А внутри них каждое сообщение как документ. Нет необходимости иметь документ, чтобы потом перечислить в нем сообщения.

Во-вторых, вам не нужны индексы, поскольку вы их используете, сделайте идентификатор сообщения атрибутом сообщения, потому что firebase поддерживает запросы по полю, и даже тогда это сомнительно, потому что если вы сделаете каждое сообщение документом, они будут иметь свои собственные автоматически сгенерированные идентификаторы, если хотите.

В-третьих, в вашем коде вы каждый раз переписываете весь документ, поэтому вы теряете свои предыдущие сообщения, поэтому, если вы сохраните его, вам нужно добавить параметр слияния:

// Update one field, creating the document if it does not exist.
db.collection("cities").document("BJ").setData([ "capital": true ], merge: true)
person Sergio Flores    schedule 26.11.2018
comment
OP использует базу данных Firebase, а не Firestore. В базе данных Firebase нет коллекций и документов; просто прямые магазины JSON. Кроме того, в базе данных нет функции слияния. - person Jay; 28.11.2018