0

我目前正在重新開發一個應用程序,通過從網站獲取原始數據而不是官方API來更新它的內部SQLite數據庫。保持Firebase實時數據庫中的數據始終保持同步

由於這很容易出錯,我想將數據處理從客戶端移到後端服務器。 這個想法是讓服務器每天多次在服務器上運行 - 類似於之前的客戶端行爲 - 並將數據存儲在Firebase實時數據庫中。然後,所有客戶端不再需要自行處理數據,而是從Firebase DB請求已解析的數據。

我只是想知道什麼是保持數據同步的最佳方法。 我提出了兩個想法,但由於我對Firebase不太熟悉,所以不知道最好。

對於我可以想象的在一些節點上使用keepSynced()setPersistenceEnabled()來保持客戶端上的數據同步。 但是我不確定這是否會在應用程序處於後臺時使數據保持最新狀態。我擔心這種方法的電池和網絡使用情況。 第三點是同時連接的數量,我用這種方法使每個客戶端都會一直連接,對嗎?

第二種方法是使用FCM在其感興趣的節點之一發生變化時通知客戶端,例如,使用Firebase雲端函數來偵聽事件並觸發消息。 然後客戶端goOnline()再次與數據庫同步並且goOffline()。這將避免大量的連接以及減少電池和網絡使用。 但我不確定如何在離線時保留設備上的所有數據? 我不想使用SQLite數據庫來保存設備上的數據。 是否setPersistenceEnabled()足以在設備上保存特定數量的數據庫備註?

或者是兩種方式混合使用?在需要的節點上設置keepSynced()setPersistenceEnabled(),並根據雲消息設置goOnline()/goOffline()

任何幫助或建議基於自己的expiriences歡迎!

回答

0

對於您考慮只使用推送數據而不通知的情況,FCM將是一個很好的選擇,因爲這會強制將數據發送到您的移動應用程序的onReceive方法中。如果您的設備處於脫機狀態,它將在重新聯機時重新發送數據。

只要您的後端發生任何更改,都會使用其預存的令牌將推送數據發送到您的設備。

1

您的第一種方法是確保Android應用始終與Firebase數據庫後端建立開放連接。這已經被詢問/嘗試過(參見herehere),並且絕對有可能。但是,您將與Android更新戰鬥,這些更新專門試圖通過應用程序中的這種行爲來減少電池使用量。

第二種方法確實比較好。我經常將其稱爲「推送同步」,因爲您正在發送推送通知(通過FCM)來觸發數據同步。 (加上:這是一個在「拉同步」模式的文字遊戲,所以很多應用程序都遵循)。使用這種方法的應用程序的一個示例是2016年穀歌的Android I/O應用程序code for which is on Github。代碼有點複雜,但actual sync is here和(iirc)它是triggered through this