8

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

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

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

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

4

2 回答 2

12

如果 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(就像它在线一样),直到它在未来某个时候上线(您还希望存储您的本地副本以处理它从不在线的情况)。

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

于 2013-05-29T13:42:03.473 回答
2

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

选择打电话snapshot.exists()而不是打电话snapshot.val() === null。正如文档所指出的,exists() 比将 snapshot.val() 与 null 进行比较更有效。

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

于 2016-08-03T12:54:03.707 回答