保持Firebase实时数据库中的数据始终保持同步

时间:2017-06-29 13:18:40

标签: android firebase firebase-realtime-database firebase-cloud-messaging

我目前正在重新使用我的应用程序,它通过从网站而非官方API获取原始数据来更新其内部SQLite数据库。

由于这非常容易出错,我希望将数据处理从客户端移到后端服务器中。 我们的想法是每天多次在服务器上运行一个脚本 - 类似于之前的客户端行为 - 并将数据存储在Firebase实时数据库中。然后,所有客户端不再需要自己处理数据,而是从Firebase数据库请求解析的数据。

我只是想知道保持数据同步的最佳方法是什么。 我想出了两个想法,但由于我对Firebase不太熟悉,我不知道什么是最好的。

我可以想象在某些节点上使用keepSynced()setPersistenceEnabled()来保持客户端上的数据同步。 但我不确定当应用程序处于后台时这是否会使数据保持最新状态。我也担心这种方法的电池和网络使用情况。 第三点是同时连接的数量,我问这种方法每个客户端都会一直连接,对吗?

第二种方法是使用FCM在其感兴趣的节点之一发生变化时通知客户端,例如:使用Firebase云功能来侦听事件并触发消息。 然后,客户端goOnline()将再次与数据库和goOffline()同步。这将避免大量连接以及减少电池和网络使用。 但我不确定如何在离线时保留设备上的所有数据? 我不想使用SQLite数据库来保存设备上的数据。 setPersistenceEnabled()是否足以在设备上保留特定数量的数据库备注?

或者两者兼而有之?根据云消息在所需节点和keepSynced() / setPersistenceEnabled()上设置goOnline()goOffline()

任何基于自己的经验欢迎的帮助或建议!

2 个答案:

答案 0 :(得分:3)

您的第一种方法是尝试确保Android应用始终与Firebase数据库后端建立开放式连接。之前已经提出过这个问题(请参阅herehere),这绝对是可行的。但你会与Android更新斗争,这些更新专门试图通过应用中的这种行为来减少电池使用量。

第二种方法确实更好。我经常将其称为“推送同步”,因为您正在发送推送通知(通过FCM)以触发数据同步。 (加上:这是“拉动同步”模式的一个文字游戏,因此很多应用程序都遵循)。使用此方法的应用程序的一个示例是Google的2016年Android I / O应用程序code for which is on Github。代码有点复杂,但actual sync is here和(iirc)为triggered through this

答案 1 :(得分:1)

考虑到只使用推送数据而不通知,FCM将是一个很好的选择,因为这会强制在移动应用程序的onReceive方法中接收发送到数据。如果您的设备处于离线状态,它会在数据再次联机时重新发送数据。

每当您的后端发生任何变更时,都会使用预先存储的令牌将推送数据发送到您的设备。