【问题标题】:Keep data from the Firebase Realtime Database always in sync始终保持 Firebase 实时数据库中的数据同步
【发布时间】:2017-12-03 05:20:10
【问题描述】:

我目前正在重新开发我的一个应用程序,该应用程序通过从网站而不是官方 API 获取原始数据来更新其内部 SQLite 数据库。

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

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

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

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

还是两者兼而有之?在需要的节点上设置keepSynced()setPersistenceEnabled(),根据云消息设置goOnline()/goOffline()

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

【问题讨论】:

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


    【解决方案1】:

    您的第一种方法是尝试确保 Android 应用始终与 Firebase 数据库后端保持开放连接。这已经被问过/尝试过(参见herehere),并且绝对是可能的。但是您将与 Android 更新作斗争,这些更新专门试图通过应用中的这种行为来减少电池使用量。

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

    【讨论】:

      【解决方案2】:

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

      每当您的后端发生任何变化时,使用他们预先保存的令牌将推送数据发送到您的设备。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-18
        • 2020-06-08
        • 2010-09-14
        • 2017-09-01
        • 2021-11-21
        • 1970-01-01
        • 2010-10-29
        相关资源
        最近更新 更多