2016-07-09 14 views
3

In Firebase Struktur Ihre Daten Abschnitt, gibt es eine Diskussion über das folgende Beispiel, wo Chat-Nachrichten unter Chat-Konversations-IDs gespeichert sind.Firebase direktes Kind vs verschachteltes Kind Ereignisse geändert

An diesem Szenario unter Berücksichtigung haben wir one unter messages chatten und alle Nachrichten unter, dass wie m1 gespeichert, m2 usw.

Nun, wenn Benutzer auf Home-Bildschirm ist, sollte es alle Gespräche auflisten, kann er/Sie ist ein Teil von. Und bei jeder neuen Nachricht wird die Benutzeroberfläche aktualisiert, um die neuen Nachrichten anzuzeigen. Aber dafür müssen wir Hörer an jede Konversation binden wie: onChildAdded für one, onChildAdded für two und so weiter.

Wie kann ich eine onChildAdded für ein Gespräch hören? Die Einstellung onChildUpdate unter messages sendet DataSnapshot mit allen Konversationen. Wenn es riesige Datensätze gibt, wäre das nicht machbar. Und herauszufinden, welches Kind des gesamten Schnappschusses tatsächlich aktualisiert wird, ist ein Schmerz.

Wenn ich Nachrichten direkt unter der messages speichern möchte, während jede Nachricht enthält conversationId Feld zu überprüfen, wo es gehört. Durch Erstellen von indexOn unter conversationId kann ich jedes hinzugefügte oder aktualisierte Kind im Auge behalten, indem ich einen Wert-Listener für messages festlege. Aber es könnte Leistungsprobleme mit einer sehr großen Datenbank geben, denke ich.

Die Notwendigkeit für die Aktualisierung eines Kindes ist, weil ich einige Berechnungen für die Statistik der Nachrichten machen muss.

Ist es möglich, diese Situation zu erreichen? Ich muss nur synchronisierte Daten für jede Konversation im Auge behalten, unabhängig von der Position, an der sich der Benutzer in der App befindet (das Einrichten des Listeners in der Application-Klasse könnte hierfür die beste Option sein), um mehrere Werte an anderer Stelle zu aktualisieren.

Die Daten ich beziehe mich ist dies:

{ 
    // Chats contains only meta info about each conversation 
    // stored under the chats's unique ID 
    "chats": { 
    "one": { 
     "title": "Historical Tech Pioneers", 
     "lastMessage": "ghopper: Relay malfunction found. Cause: moth.", 
     "timestamp": 1459361875666 
    }, 
    "two": { ... }, 
    "three": { ... } 
    }, 

    // Conversation members are easily accessible 
    // and stored by chat conversation ID 
    "members": { 
    // we'll talk about indices like this below 
    "one": { 
     "ghopper": true, 
     "alovelace": true, 
     "eclarke": true 
    }, 
    "two": { ... }, 
    "three": { ... } 
    }, 

    // Messages are separate from data we may want to iterate quickly 
    // but still easily paginated and queried, and organized by chat 
    // conversation ID 
    "messages": { 
    "one": { 
     "m1": { 
     "name": "eclarke", 
     "message": "The relay seems to be malfunctioning.", 
     "timestamp": 1459361875337 
     }, 
     "m2": { ... }, 
     "m3": { ... } 
    }, 
    "two": { ... }, 
    "three": { ... } 
    } 
} 
+0

Haben Sie also eine Lösung für Ihr Problem gefunden? – user2924714

+0

@ user2924714 Nop .. Ich versuche, die Daten zu überprüfen und zu aktualisieren, wenn der Benutzer einen Chat eingibt. Wenn der Benutzer den Chat beendet, hören Sie auf, auf Änderungen an diesem Knoten zu warten. Nichts anderes. – kirtan403

Antwort

0

Ich denke nicht, Sie Hörer für alle Chat-Knoten registrieren müssen {eins, zwei, drei, etc}. Besser, wenn Sie Elternknoten hören, um alle childs zu hören eins, zwei, drei usw..

Stellen Sie sich vor, Ihr erster Bildschirm ist eine Liste der Chat-Räume, die grundlegende Informationen wie Titel, letzte Nachricht, Zeitstempel enthält. Es ist besser, wenn Sie einen untergeordneten Ereignis-Listener für den Knoten /chats/ registrieren. So können Sie eine Liste aller Chat-Elemente erhalten. Wenn ein Benutzer auf ein Chatelement klickt, beispielsweise /chats/one/, registrieren Sie einen untergeordneten Ereignis-Listener für /messages/one/ und /members/one/ Knoten für Mitglieder, die zu diesem Chat gehören.

+0

Ich weiß, dass ich das tun kann. Aber ich möchte einen Listener für alle Nachrichten in "Nachrichten" einstellen. Selbst wenn der Benutzer den Chat "eins" geöffnet hat, sollte sich im Hintergrund ein Listener befinden, der auf alle Nachrichten hören soll. – kirtan403

+0

Wenn Sie nicht Ihre Aktivität töten, wenn Nachrichtenaktivität zu starten, wird es weiterhören – uguboz

+0

Sie sollten removelistener, damit es aufhören zu hören – uguboz

Verwandte Themen