Как получить доступ к данным в документах из слушателя в реальном времени python - PullRequest
0 голосов
/ 28 мая 2020

Приносим извинения, если что-то из этого не имеет смысла, я изо всех сил пытаюсь полностью понять слушателей в реальном времени.

Я пытаюсь добавить слушателя в реальном времени в часть чата моего приложения, чтобы я мог добавлять новые сообщения на экран по мере их поступления в базу данных. В приведенном ниже коде я загружаю все текущие сообщения на экран, когда пользователь открывает страницу, а затем (пытаюсь) добавить слушателя в реальном времени, чтобы любые новые сообщения могли быть добавлены на экран.

Однако doc_snapshot - это просто список идентификаторов документов, а не message_dict, который я использовал выше, как мне получить доступ к данным для каждого документа в doc_snapshot, а не только к идентификатору?

Или я делаю это совершенно неправильно, не следует ли мне загрузить одноразовую загрузку сообщений при открытии экрана и просто использовать прослушиватель в реальном времени для загрузки сообщений и прослушивания новых сообщений?

self.local_id - это идентификатор пользователя, который вошел в систему, doc_id - это идентификатор человека, которому они отправляют сообщения.

    def move_to_chat(self, doc_id):
        group_id = self.local_id + ":"+ doc_id
        doc_ref = self.my_firestore.db.collection(u'messages').document(group_id)
        doc = doc_ref.get()
        if doc.exists: # Check if the document exists. If it does, load the messages to the screen
            get_messages = self.my_firestore.db.collection(u'messages').document(group_id).collection(group_id).order_by(u'Timestamp').limit(20)
            messages = get_messages.stream()
            for message in messages:
                message_dict = message.to_dict()
                try:
                    if message_dict['IdFrom'] == self.local_id:
                        #Add label to left of screen
                    else:
                        #Add label to right of screen
                except:
                    pass
        else: # If it doesn't, create it
            self.my_firestore.db.collection(u'messages').document(group_id).set({
                u'GroupId': group_id
            })
            add_to_doc = self.my_firestore.db.collection(u'messages').document(group_id).collection(group_id).document()
            add_to_doc.set({
                u'Timestamp': datetime.datetime.now()
            })

        # Watch for new messages
        self.query_watch = self.my_firestore.db.collection(u'messages').document(group_id).collection(group_id)
        # Watch the document
        self.query_watch.on_snapshot(self.on_snapshot)

    def on_snapshot(self, doc_snapshot, changes, read_time):
        for doc in doc_snapshot:
            #Here's where I'd like to access data from the documents, to find the message that has been added.

1 Ответ

0 голосов
/ 05 июня 2020

В документации Google Firestore для метода моментальных снимков объясняются классы для представления документов для API Google Cloud Firestore. Вы можете обратиться к этому документу, чтобы согласовать возвращаемые значения.

...