【问题标题】:How to sync offline database with Firebase when device is online?设备在线时如何与 Firebase 同步离线数据库?
【发布时间】:2013-05-29 09:15:30
【问题描述】:

我目前正在使用 angularJS 和 phonegap 为 Android / iOS 构建一个测试应用程序。

该应用仅使用存储在 Firebase 数据库中的文本数据。我希望应用程序拥有自己的本地数据库(设备离线时使用)和某个时候(设备在线时) 与 Firebase 数据库同步。

离线模式使用phonegap/cordova的存储API。我可以只检查设备的在线状态并定期备份在线数据库吗?

关于我如何实现这一点的任何线索?上次提出类似问题时,答案是“还没有”...(here)...因为它专注于假设的 Firebase 功能。

【问题讨论】:

    标签: angularjs cordova firebase


    【解决方案1】:

    如果 Firebase 一开始就在线并暂时断开连接,然后稍后重新连接,它将同步本地数据。因此,在许多情况下,一旦 Firebase 上线,您就可以在中断期间继续推送到 Firebase。

    对于真正的离线使用,您可能需要监控设备的状态,并查看.info/connected 以了解 Firebase 何时连接。

    new Firebase('URL/.info/connected').on('value', function(ss) {
       if( ss.val() === null ) /* firebase disconnected */
       else /* firebase reconnected */
    });
    

    在支持真正的离线存储之前,使用当前 Firebase 工具集实现此目的的方法是

    1. 保持本地数据简单而小巧
    2. 设备上线后,将本地存储的数据转成JSON
    3. 使用 set() 将数据保存到 Firebase 中的适当路径

    此外,如果应用在设备离线时加载,出于某种原因,您可以通过调用 set() 来“初始化”数据来“初始化”Firebase。然后,您可以照常使用 Firebase(就像它在线一样),直到它在未来某个时间上线(您还希望存储本地副本以处理它从不在线的情况)。

    显然,越简单越好。并发修改、本地存储大小限制以及许多其他因素将迅速累积,使任何离线存储解决方案变得复杂且耗时。

    【讨论】:

    • 感谢您的提示,我会尽快尝试实现这一点。接下来要做的就是能够离线启动...
    • 嗨,我不明白你的意思是什么......你可以通过......Thx“启动”Firebase
    • 处理 Firebase 身份验证的任何解决方案?在本地缓存令牌并允许登录而不挂起应用程序?
    • 最新版本的 Firebase 为离线模式下的身份验证提供了一些改进的支持。在文档中阅读它。但是,在离线持久性可用之前,无法提供完整的离线支持。
    • 当数据按时关闭时会发生什么?如果我 set() 或 update() 并重新连接,它不会认为该数据较新并覆盖服务器吗?
    【解决方案2】:

    一段时间后,我想在@Kato 的回答中添加 .02:

    选择拨打snapshot.exists(),而不是拨打snapshot.val() === null。正如documentation 指出的那样,exists() 比将 snapshot.val() 与 null 进行比较更有效。

    如果您想更新数据,更喜欢使用update() 方法而不是set(),因为最后一个方法会覆盖您的 Firebase 数据。你可以阅读更多here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-27
      • 2017-01-06
      • 2020-01-12
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多