2017-08-18 26 views
0

我正在使用Firebase獲取消息列表。問題是,我只需要查看打開頁面後發送的消息。基本上我不需要將消息存儲在數據庫中,我只需要將其廣播到所有連接的設備。只有使用Firebase的新記錄

ref.limitToLast(1).on('child_added', function(snapshot) { 
    console.log(snapshot.name(), snapshot.val()); 
}); 

上面的代碼正確返回最後一個孩子,但我用我不需要的消息填充我的數據庫。何時適合刪除「舊」消息?

+1

您可以存儲信息的發佈日期/時間的記錄,並只返回那些> =日期/時間用戶連接 – ptpaterson

+0

什麼,如果有是一個連接了很長時間的設備。我想你只需要弄清楚什麼時候開始隱藏舊的東西是可以接受的。我覺得Firebase應該能夠爲你保留很多東西。 – ptpaterson

+0

這是一個很好的觀點。恐怕設備1收到並刪除了記錄,然後設備2沒有任何東西。不確定Firebase是否同時廣播。 – handsome

回答

1

我不建議刪除舊消息,而不是讓每個用戶都照顧只讀新內容。

如果您的消息數據結構正在工作,那麼您只需要爲模型添加1個屬性。每次發送消息時,都會在屬性中添加時間戳。

Here is the doc how to use the ServerValue.TIMESTAMP

現在每個消息節點都可以按時間戳排序。

"messages": { 
    "chat_1": { 
     "push_key_usually":{ 
     "message": "hello", 
     "owner": "maybe the UID or the email", 
     "chat_key": "chat_1", 
     "key": "push_key_usually", 
     "timestamp": 981212312 
     } 
    } 
} 

要完成此操作,需要讓每個用戶在加載聊天時設置自己的時間戳。這樣,您可以從數據庫中獲取該值,並使用該時間戳對您的消息進行排序。完整的順序是首先查詢值,如果它是空的,那麼是第一次,只需要使用自定義時間戳(可以爲零或當前時間減去幾分鐘)詢問每個消息或工作並設置該值。如果它不爲空,則將該值用於查詢,並在獲取它之後,再次設置時間戳。

"connections": { 
    "user_UID": 12312412 
} 

現在你可以做這樣的事情:

reference.child("messages/chat_1/push_key_usuarlly").orderByChild("timestamp").startAt(yourTimeStamp).once... 
0

Firebase數據庫不是一種消息傳遞機制,它是一種狀態同步機制。如果你想要,你可以在數據庫上模擬消息傳遞機制,但你必須爲此做好工作。

完成此操作的一種方法是爲要發送給每個設備的消息寫入消息。這意味着每個設備都可以簡單地刪除它讀取的每條消息,並且您的數據庫永遠不會超過未讀消息設備的總數。

另一種方法是隻存儲一次消息,但跟蹤哪些設備讀取了它。一旦每個設備都讀取完畢,您可以刪除該消息。您需要在數據庫中存儲「讀取每條消息的設備」和「所有設備列表」。這種方法可能需要較少的存儲,但它肯定會在代碼中更復雜。