如何在设备联机时将离线数据库与Firebase同步?

时间:2013-05-29 09:15:30

标签: angularjs cordova firebase

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

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

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

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

2 个答案:

答案 0 :(得分: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中
  4. 此外,如果应用在设备离线时加载,出于某种原因,您可以通过调用set()“初始化”数据来“启动”Firebase。然后你就可以正常使用Firebase(就像在线一样),直到它在将来的某个时刻上线(你还希望存储你的本地副本以处理从未发生过的情况)。

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

答案 1 :(得分:2)

过了一段时间,我想将.02添加到@Kato的答案:

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

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