2016-07-09 3 views
3

В Firebase Структура ваших данных раздел, рассказывается о нижеследующем примере, в котором сообщения чата хранятся под идентификаторами чата.Пожарная битва прямого ребенка против вложенных детей с изменениями событий

При рассмотрении этого конкретного сценария, мы чат one под messages и все сообщения хранятся в том, что, как m1, m2 и т.д.

Теперь, когда пользователь находится на домашнем экране, он должен перечислить все разговоры, что он/она входит в состав. И в любом из них, новые сообщения приходят, что пользовательский интерфейс будет обновляться, чтобы отображать новые сообщения. Но для этого нам нужно связать слушателей с каждым разговором, как: onChildAdded для one, onChildAdded для two и так далее.

Как я могу прослушать onChildAdded для обсуждения? Установка onChildUpdate на messages отправит DataSnapshot, включая все разговоры. Если есть огромные записи, это было бы невозможно. И найти, какой ребенок всего снимка на самом деле обновляется, - это боль.

Если я предпочитаю хранить сообщения непосредственно под полем messages, а каждое сообщение содержит поле conversationId, чтобы проверить, где он находится. Создав indexOn на conversationId, я могу следить за каждым добавленным или обновленным ребенком, установив прослушиватель значений для messages. Я думаю, что может возникнуть проблема с производительностью с очень большой базой данных.

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

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

Данные, которые я имею в виду это:

{ 
    // 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

Итак, вы нашли решение проблемы? – user2924714

+0

@ user2924714 Nop .. Я пытаюсь проверить и обновить данные, когда пользователь входит в один чат. Если пользователь выходит из чата, прекратите прослушивание изменений на этом узле. Ничего больше. – kirtan403

ответ

0

Я не думаю, что вам нужно зарегистрировать слушателей для всех узлов чат {один, два, три, и т.д.}. Лучше, если вы прослушаете родительский узел для прослушивания всех дочерних элементов один, два, три и т. Д..

Представьте, что ваш первый экран - это список чатов, который содержит основную информацию, такую ​​как название, последнее сообщение, timestamp. Лучше, если вы зарегистрируете прослушиватель дочерних событий для узла /чатов/. Таким образом, вы можете получить список всех элементов чата. Когда пользователь нажимает на элемент чата, например /чаты/один/, зарегистрируйте прослушиватель дочерних событий для /messages/one/ и /members/one/ узел для участников этого чата.

+0

Я знаю, что смогу это сделать. Но я хочу установить прослушиватель для всех сообщений внутри 'messages'. Даже если пользователь открыл чат 'one', в фоновом режиме должен быть прослушиватель, который должен прослушивать все сообщения. – kirtan403

+0

, если вы не убили свою активность, когда начать работу с сообщениями, он продолжит слушать – uguboz

+0

вам следует удалить стиратель, чтобы остановить прослушивание – uguboz

Смежные вопросы